SQLAlchemy:pool_size 和 SQLite
Posted
技术标签:
【中文标题】SQLAlchemy:pool_size 和 SQLite【英文标题】:SQLAlchemy: pool_size and SQLite 【发布时间】:2013-04-12 14:07:03 【问题描述】:代码
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
的原因是什么?它破坏了用户的代码。
【问题讨论】:
SQLAlchemy 主要版本在许多其他方面也不向后兼容。猜测一下:SQLite 不需要线程池? 是的,SQLAlchemy 不需要线程池,但我们不知道“先验”我将处理什么类型的数据库。在大多数情况下是 Oracle,但在某些情况下是 SQLite。为所有内容添加“pool_size”很好,但不会破坏代码。 仅供参考,SQLAlchemy 版本从 0.X 到 0.Y 的更改总是包含许多向后不兼容的更改,您可以在文档中查看它们:whats new in SQLAlchemy 0.7?SQLite now uses nullpool for file-based databases 此外,在 0.6 中使用“pool_size”参数在非 sqlite 和 sqlite 数据库 URL 中也是一个坏主意。 0.6 对 SQLite 使用完全不同的池样式,这意味着 pool_size 具有完全不同的语义。不同的数据库后端总是需要不同的配置调整,最好让应用程序代码对此敏感,存储 URL 和一组调整 **kwargs 以用于每种类型的数据库。 【参考方案1】:来自SQLAlchemy 0.7 What's New document:
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 section。
如果需要,您仍然可以提供不同的池类,方法是在 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)
【讨论】:
@zzzeek: :-) 是那些小数点让你大吃一惊,不是吗?以上是关于SQLAlchemy:pool_size 和 SQLite的主要内容,如果未能解决你的问题,请参考以下文章