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的默认值为SingletonThreadPool
。
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不太熟悉。