代码
create_engine(sqlite:////infodb/timestamp.db', pool_size=10)
在SQLAlchemy版本0.6.3中正常工作。但是,它在0.7.1版本中不起作用。
我收到的错误消息如下
TypeError:发送到create_engine()的参数“pool_size”无效, 使用配置SQLiteDialect_pysqlite / NullPool / 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
到NullPool
的原因是什么?它打破了用户的代码。
答案 0 :(得分:5)
来自SQLAlchemy 0.7 What's New document:
SQLite - SQLite方言现在使用
NullPool
用于基于文件的数据库此更改 99.999%向后兼容,除非您在连接池连接中使用临时表。
基于文件的SQLite连接非常快,使用
NullPool
意味着每次调用Engine.connect
都会创建一个新的pysqlite连接。以前,使用
SingletonThreadPool
,这意味着线程中某个引擎的所有连接都是相同的连接。这种方法更直观,特别是在使用多个连接时。
SingletonThreadPool
仍然是使用:memory:
数据库时的默认引擎。请注意,由于SQLite处理临时表的方式,此更改会破坏在Session提交中使用的临时表。如果需要超出一个池连接范围的临时表,请参阅http://www.sqlalchemy.org/docs/dialects/sqlite.html#using-temporary-tables-with-sqlite处的注释。
主要的SQLAlchemy版本(因此在0.5到0.6或0.6到0.7之间)到目前为止总是包含向后不兼容的更改,因为主要想法正在制定中。 0.7也不例外,请参阅Backwards Incompatible API Changes section。
如果必须,您仍然可以通过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)