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

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

【问题讨论】:

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的主要内容,如果未能解决你的问题,请参考以下文章

为在Gunicorn上运行的Flask-SQLAlchemy应用选择数据库pool_size

sqlalchemy 连接池

SQLAlchemy连接数据库创建表

SQLALchemy之创建表,删除表

如何在 SQLAlchemy 中加载嵌套关系?

Sqlalchemy 子查询