[解決済み] SQLAlchemy: flush() と commit() の違いは何ですか?
質問
とはどのような違いがあるのですか?
flush()
と
commit()
をSQLAlchemyで作成することはできますか?
ドキュメントを読みましたが、よくわかりません。私が持っていない事前理解を前提としているようです。
特にメモリ使用量への影響に興味があります。私はいくつかのデータを一連のファイルからデータベースにロードしています(合計で約500万行)、そして私のセッションは時々落ちています。
を多用しすぎているのでは?
commit()
が足りず
flush()
を呼び出しますが、その違いが何なのかをよく理解していないと、伝えるのは難しいですね。
どのように解決するのか?
Session オブジェクトは基本的に、データベースへの変更 (更新、挿入、削除) の進行中のトランザクションです。これらの操作はコミットされるまでデータベースには残りません(セッション・トランザクションの途中で何らかの理由でプログラムが中断すると、コミットされていない変更は失われます)。
セッションオブジェクトは、トランザクション操作を
session.add()
とはいえ、データベースへの通信は
session.flush()
が呼び出される。
session.flush()
は、一連の操作(挿入、更新、削除)をデータベースに伝達します。データベースはそれらをトランザクション内の保留操作として保持します。データベースが現在のトランザクションのCOMMITを受け取るまで、変更はディスクに恒久的に保存されませんし、他のトランザクションからも見えません(これはつまり
session.commit()
が行う)。
session.commit()
は、それらの変更をデータベースにコミット(永続化)します。
flush()
は
常に
の呼び出しの一部として呼び出されます。
commit()
(
1
).
Sessionオブジェクトを使用してデータベースに問い合わせると、問い合わせはデータベースと、保持しているコミットされていないトランザクションのフラッシュされた部分の両方から結果を返します。デフォルトでは、Sessionオブジェクトは
autoflush
の操作を無効にすることができます。
この例で、このことがより明確になるといいですね。
#---
s = Session()
s.add(Foo('A')) # The Foo('A') object has been added to the session.
# It has not been committed to the database yet,
# but is returned as part of a query.
print 1, s.query(Foo).all()
s.commit()
#---
s2 = Session()
s2.autoflush = False
s2.add(Foo('B'))
print 2, s2.query(Foo).all() # The Foo('B') object is *not* returned
# as part of this query because it hasn't
# been flushed yet.
s2.flush() # Now, Foo('B') is in the same state as
# Foo('A') was above.
print 3, s2.query(Foo).all()
s2.rollback() # Foo('B') has not been committed, and rolling
# back the session's transaction removes it
# from the session.
print 4, s2.query(Foo).all()
#---
Output:
1 [<Foo('A')>]
2 [<Foo('A')>]
3 [<Foo('A')>, <Foo('B')>]
4 [<Foo('A')>]
関連
-
[解決済み】django インポートエラー - core.managementという名前のモジュールがない
-
[解決済み] staticmethodとclassmethodの違いについて
-
[解決済み] Pythonのリストメソッドであるappendとextendの違いは何ですか?
-
[解決済み] 最小限の驚き」と「変更可能なデフォルトの引数
-
[解決済み] print関数の出力をフラッシュする(pythonの出力をバッファリング解除する)にはどうすればよいですか?
-
[解決済み] リストにおけるdel、remove、popの違いについて
-
[解決済み] リストとタプルの違いは何ですか?
-
[解決済み】__str__と__repr__の違いは何ですか?
-
[解決済み】venv, pyvenv, pyenv, virtualenv, virtualenvwrapper, pipenvなどの違いは何ですか?
-
[解決済み】Djangoでnull=Trueとblank=Trueの違いは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
ピロウズ画像色処理の具体的な活用方法
-
Python 人工知能 人間学習 描画 機械学習モデル作成
-
pythonサイクルタスクスケジューリングツール スケジュール詳解
-
python implement mysql add delete check change サンプルコード
-
[解決済み】「RuntimeError: dictionary changed size during iteration」エラーを回避する方法とは?
-
[解決済み】「SyntaxError.Syntax」は何ですか?Missing parentheses in call to 'print'」はPythonでどういう意味ですか?
-
[解決済み】IndexError: invalid index to scalar variableを修正する方法
-
[解決済み】ValueError: pickleプロトコルがサポートされていません。3、python2 pickleはpython3 pickleでダンプしたファイルを読み込むことができない?
-
[解決済み】SQLAlchemyの行エントリを更新する方法は?
-
[解決済み] sqlalchemy flush()で挿入されたidを取得する?