5

psqlクライアントを介してこのSQLクエリを実行すると、数秒間(〜90秒、巨大なテーブルなので正常です)実行されて返され、行が正常に挿入されたことを確認できます。

SELECT merge_data('898989', '111111111', '10000')

これは、UPDATEまたはINSERTを実行するストアドプロシージャであり、プロシージャはエラーなしで実行され、テーブルにエントリを取得します。

Pythonプログラムから同じことを行おうとすると、クエリは2秒かかり、エラーは返されません。テーブルに何も表示されません。詳細については、ステートメントはpostgresqkで正常に実行されます(pgsqlログで確認できます)。コードスニペットは次のとおりです。

conn = psycopg2.connect("...")
cursor = conn.cursor()

try:
    cursor.callproc("merge_data", ['898989', '111111111', '10000'])
except:
    print "ERROR !"

cursor.close()
4

2 に答える 2

6

解決しました!

デフォルトでは、psycopg2は実行されたステートメントごとに自動コミットしないため、(最後に)接続を閉じると、ロールバックが実行されたかのように、保留中のすべてのトランザクションが破棄されます。

各cursor.execute()または.callprocの後にconn.commit()を呼び出すか、またはを使用してグローバルスコープに設定することができます。

conn.set_isolation_level(psycopg2.extensions.ISOLATION_LEVEL_AUTOCOMMIT)
于 2012-06-10T21:31:53.620 に答える
0

自動コミット機能が本当に必要な場合を除いて、分離レベルを変更する代わりにconn.commit()を使用する必要があります。

Python DB2 API

于 2021-04-08T22:39:38.543 に答える