SQLAlchemy:pool_size和SQLite

时间:2013-04-12 14:07:03

标签: python orm sqlalchemy

代码

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中,poolclasssqlalchemy.pool.SingletonThreadPool的一个实例,因此处理pool_size没有问题。

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

1 个答案:

答案 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处的注释。

     

#1921

主要的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)