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 レイヤーを利用するこのコードはSingletonThreadPool
、SQLite イン メモリ データベースおよびNullPool
SQLite ファイル データベースで正常に動作します。ただし、速度は大幅に低下します。
私は SQLAlchemy バージョン 0.8.3 を使用しているため、SQLite ファイル ベースのデータベースのデフォルトはNullPool
でありSingletonThreadPool
、SQLite イン メモリ データベースのデフォルトは です。
http://docs.sqlalchemy.org/en/latest/dialects/sqlite.html#pysqlite-threading-pooling
私の質問は、なぜ最初のスニペットがNullPool
SQLite ファイル データベースを使用して壊れるのですか? このスニペットは高速であるため、使用したいと思います (2 番目のスニペットの約 1.5 倍の速度)。
編集 :
list_of_some_class_dictionaries = [{'foo': foo, 'bar': bar}, ...]
session.execute(SomeClass.__table__.insert(), list_of_some_class_dictionaries)
エンジン オブジェクトではなく、セッション オブジェクトから実行を呼び出すと、問題が軽減されるようです。engine.execute
データベースがまだセッションにロックされている間に、呼び出しが別の接続を開こうとした可能性があると思います。ただし、私は SQLAlchemy に十分に精通していません。