3

以前は、executeステートメントを使用してPythonを実行および実行できました。これにより、値1,2がそれに応じてa、bに挿入されます。しかし、先週開始したとき、エラーは発生しませんでしたが、データベースで何も起こりませんでした。フラグなし-なし...1,2がテーブルに挿入または置換されませんでした。

connect.execute("REPLACE INTO TABLE(A,B) VALUES(1,2)")

サーバーへの接続が失われた場合にcommit()が必要な記事をついに見つけました。だから私は追加しました

connect.execute("REPLACE INTO TABLE(A,B) VALUES(1,2)")
connect.commit()

今は動作しますが、少しだけ理解したいのですが、接続が失われなかったことがわかっているのに、なぜこれが必要なのですか?

  • Pythonの新機能-ありがとう。
4

2 に答える 2

3

これはPythonやODBCの問題ではなく、リレーショナルデータベースの問題です。

リレーショナルデータベースは通常、トランザクションの観点から機能します。何かを変更すると、トランザクションが開始され、またはのいずれcommitかになるまでトランザクションは終了しませんrollback。これにより、データベースに同時に表示される複数の変更を連続して行うことができます(commitが発行されたとき)。rollbackまた、(を介して)問題が発生した場合に、行った各変更を明示的に元に戻すのではなく、トランザクション全体を1つの単位として中止することもできます。

自動コミットをオンにすることで、この機能を透過的にすることができます。この場合、commit各ステートメントの後にaが発行されますが、これは一般的に不適切な方法と見なされます。

于 2013-02-25T22:21:38.307 に答える
2

コミットしないと、すべてのクエリが 1 つのトランザクションにまとめられます。これは、クエリが相互に関連している場合に、より安全 (そしてパフォーマンスが向上する可能性があります) です。たとえば、2 つの更新クエリを使用して 1 つのアカウントから別のアカウントに送金するなど、独立しては意味をなさない 2 つのクエリ間で権力が行き交う場合はどうなるでしょうか。

必要ない場合は true に設定できautocommitますが、そうする理由はあまりありません。

于 2013-02-25T22:20:34.560 に答える