了解SQLAlchemy中的SQLite线程池行为

时间:2013-11-11 00:37:19

标签: python sqlite sqlalchemy

list_of_some_class_dictionaries = [{'foo': foo, 'bar': bar}, ...]
engine.execute(SomeClass.__table__.insert(), list_of_some_class_dictionaries)

这使用NullPool与SQLite文件数据库(默认值)断开;它会引发sqlalchemy.exc.OperationalError: (OperationalError) database is locked错误。但是,它适用于SingletonThreadPool,其中包含SQLite文件数据库或内存数据库中的SQLite。

list_of_objects = [SomeClass(foo=foo, bar=bar), ...]
for object in list_of_objects :
    session.add(object)

利用ORM层的代码可以在内存数据库中的SQLite上使用SingletonThreadPool,在SQLite文件数据库上使用NullPool。但是,它明显变慢了。

我正在使用SQLAlchemy版本0.8.3,因此基于SQLite文件的数据库的默认值为NullPool,而内存数据库中的SQLite的默认值为SingletonThreadPoolhttp://docs.sqlalchemy.org/en/latest/dialects/sqlite.html#pysqlite-threading-pooling

我的问题是为什么第一个片段使用NullPool与SQLite文件数据库完全断开?我想使用这个片段,因为它更快(约为第二个片段速度的1.5倍)。

编辑:

list_of_some_class_dictionaries = [{'foo': foo, 'bar': bar}, ...]
session.execute(SomeClass.__table__.insert(), list_of_some_class_dictionaries)

调用会话对象的执行而不是引擎对象,似乎可以缓解这个问题。我认为在数据库仍然锁定到会话时,调用engine.execute可能试图打开另一个连接。但是,我对SQLAlchemy不太熟悉。

0 个答案:

没有答案