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

这打破了使用NullPoolSQLite 文件数据库(默认);它会引发sqlalchemy.exc.OperationalError: (OperationalError) database is locked错误。但是,它可以与SingletonThreadPoolSQLite 文件数据库或内存数据库中的 SQLite 一起使用。

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

此代码利用 ORM 层SingletonThreadPool在内存数据库中NullPool的 SQLite 和 SQLite 文件数据库上运行良好。但是,它的速度要慢得多。

我使用的是 SQLAlchemy 版本 0.8.3,因此基于 SQLite 文件的数据库的默认值为NullPool,而SingletonThreadPool内存数据库中的 SQLite 的默认值。 http://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 还不够熟悉。

4

0 回答 0