SQLAlchemy: 连接池大小和SQLite

5

这段代码

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

在SQLAlchemy 0.6.3版本中运行正常,但在0.7.1版本中不能使用。

我收到的错误信息如下:

TypeError: Invalid argument(s) 'pool_size' sent to create_engine(), using configuration SQLiteDialect_pysqlite/NullPool/Engine. Please check that the keyword arguments are appropriate for this combination of components.

在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版本不兼容。我想知道为什么要从SingletonThreadPool转换到NullPool?它会破坏用户的代码。


SQLAlchemy的主要版本在许多其他方面也不向后兼容。猜测一下:SQLite不需要线程池? - Martijn Pieters
是的,SQLAlchemy不需要线程池,但我们不知道我将处理什么类型的数据库。在大多数情况下,它是Oracle,但在某些情况下它是SQLite。为所有内容设置“pool_size”是可以的,但现在它会破坏代码。 - musthero
只是给你个提醒,SQLAlchemy从0.X版本到0.Y版本之间经常包含很多不兼容的变化,请参考文档进行查阅:SQLAlchemy 0.7有什么新特性? SQLite现在对于基于文件的数据库使用nullpool - zzzeek
1
同时,在非 SQLite 和 SQLite 数据库 URL 上使用 0.6 版本中的 "pool_size" 参数也不是个好主意。0.6 版本在 SQLite 中使用了完全不同的池样式,这意味着 pool_size 具有完全不同的语义。不同的数据库后端始终需要不同的配置调整,最好让应用代码对此敏感,存储每种类型数据库都要使用的 URL 和一组调优 **kwargs。 - zzzeek
1个回答

12
SQLAlchemy 0.7新特性文档中:
SQLite - SQLite方言现在对于基于文件的数据库使用NullPool。这个改变99.999%向后兼容,除非您在连接池连接之间使用临时表。基于文件的SQLite连接非常快,并且使用NullPool意味着每次调用Engine.connect都会创建一个新的pysqlite连接。以前使用的是SingletonThreadPool,这意味着线程中对某个引擎的所有连接将是相同的连接。新方法旨在更加直观,特别是在使用多个连接时。当使用:memory:数据库时,默认引擎仍为SingletonThreadPool。请注意,由于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也不例外,请参见向后不兼容的API更改部分
如果必须的话,仍然可以通过在connect调用中传递poolclass关键字来提供不同的池类:
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)

1
@zzzeek: :-) 就是那些小数点让你犯了错,不是吗? - Martijn Pieters

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接