SQLAlchemy:pool_size和SQLite

mus*_*ero 2 python orm sqlalchemy

代码

create_engine(sqlite:////infodb/timestamp.db', pool_size=10)

在SQLAlchemy版本0.6.3中正常工作.但是,它在0.7.1版本中不起作用.

我得到的错误消息如下

TypeError:使用配置SQLiteDialect_pysqlite/NullPool/Engine发送到create_engine()的无效参数'pool_size'.请检查关键字参数是否适合此组件组合.

在0.7.1版中,poolclass变量的默认值是.的实例sqlalchemy.pool.NullPool.反过来,该NullPool对象不接受pool_size变量.在版本0.6.3中,poolclass是一个实例,sqlalchemy.pool.SingletonThreadPool因此没有问题处理pool_size.

因此,版本SQLAlchemy 0.7.1 与0.6.3 不向后兼容.所以,我想知道,什么是从去的理由SingletonThreadPoolNullPool?它打破了用户的代码.

Mar*_*ers 5

来自SQLAlchemy 0.7什么是新文档:

SQLite - SQLite方言现在NullPool用于基于文件的数据库

除非您在连接池连接中使用临时表,否则此更改向后兼容99.999%.

基于文件的SQLite连接非常快,并且使用NullPool每次调用Engine.connect创建新的pysqlite连接.

之前SingletonThreadPool使用过,这意味着线程中某个引擎的所有连接都是相同的连接.这意味着新方法更直观,特别是在使用多个连接时.

SingletonThreadPool仍然:memory:是使用数据库时的默认引擎.

请注意,由于SQLite处理临时表的方式,此更改会破坏跨会话提交使用的临时表.如果需要超出一个池连接范围的临时表,请参阅http://www.sqlalchemy.org/docs/dialects/sqlite.html#using-temporary-tables-with-sqlite上的说明.

#1921年

到目前为止,主要的SQLAlchemy版本(因此介于0.5和0.6或0.6到0.7之间)总是包含向后不兼容的更改,因为主要想法正在制定中.0.7也不例外,请参阅Backwards Incompatible API Changes部分.

如果必须,您仍然可以通过调用中传递poolclass关键字来提供不同的池类connect:

from sqlalchemy.pool import SingletonThreadPool

engine = create_engine('sqlite:///mydb.db', poolclass=SingletonThreadPool)
Run Code Online (Sandbox Code Playgroud)

传入显式池类也适用于0.6.就个人而言,我在这里使用异常处理:

try:
    engine = create_engine(URL, pool_size=10)
except TypeError:
    # The pool_size argument won't work for the default SQLite setup in SQLAlchemy 0.7, try without
    engine = create_engine(URL)
Run Code Online (Sandbox Code Playgroud)