2
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 イン メモリ データベースおよびNullPoolSQLite ファイル データベースで正常に動作します。ただし、速度は大幅に低下します。

私は SQLAlchemy バージョン 0.8.3 を使用しているため、SQLite ファイル ベースのデータベースのデフォルトはNullPoolでありSingletonThreadPool、SQLite イン メモリ データベースのデフォルトは です。 http://docs.sqlalchemy.org/en/latest/dialects/sqlite.html#pysqlite-threading-pooling

私の質問は、なぜ最初のスニペットがNullPoolSQLite ファイル データベースを使用して壊れるのですか? このスニペットは高速であるため、使用したいと思います (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 に十分に精通していません。

4

0 に答える 0