5

编码

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

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

我得到的错误信息如下

类型错误:使用配置 SQLiteDialect_pysqlite/NullPool/Engine 将无效参数“pool_size”发送到 create_engine()。请检查关键字参数是否适合这种组件组合。

在 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。SingletonThreadPool所以我想知道,从to去的原因是什么NullPool?它破坏了用户的代码。

4

1 回答 1

12

来自SQLAlchemy 0.7 What's New 文档

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

此更改为99.999% 向后兼容,除非您跨连接池连接使用临时表。

基于文件的 SQLite 连接非常快,并且 usingNullPool意味着每次调用Engine.connect都会创建一个新的 pysqlite 连接。

以前,SingletonThreadPool使用了 ,这意味着线程中到某个引擎的所有连接都是同一个连接。新方法旨在更直观,尤其是在使用多个连接时。

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

请注意,由于 SQLite 处理临时表的方式,此更改会破坏跨 Session commits 使用的临时表。如果需要超出一个池连接范围的临时表,请参阅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)

传入显式池类也适用于 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)
于 2013-04-12T14:19:15.267 回答