次を使用して、postgresqlデータベーステーブルにレコードを挿入しようとしましたが、機能しません。エラーは表示されませんが、テーブルにレコードはありません。コミットなどが必要ですか? Bitnami djangostack installでインストールされたpostgresqlデータベースを使用しています。
import psycopg2
try:
conn = psycopg2.connect("dbname='djangostack' user='bitnami' Host='localhost' password='password'")
except:
print "Cannot connect to db"
cur = conn.cursor()
try:
cur.execute("""insert into cnet values ('r', 's', 'e', 'c', 'w', 's', 'i', 'd', 't')""")
except:
print "Cannot insert"
各エントリをデータベースにコミットする必要がない場合は、次の行を追加できます。
conn.autocommit = True
したがって、結果のコードは次のようになります。
import psycopg2
try:
conn = psycopg2.connect("dbname='djangostack' user='bitnami' Host='localhost' password='password'")
conn.autocommit = True
except:
print "Cannot connect to db"
cur = conn.cursor()
try:
cur.execute("""insert into cnet values ('r', 's', 'e', 'c', 'w', 's', 'i', 'd', 't')""")
except:
print "Cannot insert"
最後にconn.commit()
が必要でした
psycopg2
は Python DB API -に準拠しているため、自動コミット機能はデフォルトでオフになっています。呼び出す必要があります conn.commit
保留中のトランザクションをデータベースにコミットします。接続(およびカーソル)はコンテキストマネージャーなので、単にwith
ステートメントを使用して、コンテキストを離れるときにトランザクションを自動的にコミット/ロールバックできます。
with conn, conn.cursor() as cur: # start a transaction and create a cursor
cur.execute(sql)
docs から:
接続が
with
ブロックを終了するときに、ブロックによって例外が発生していない場合、トランザクションはコミットされます。例外の場合、トランザクションはロールバックされます。カーソルが
with
ブロックを終了すると、カーソルは閉じられ、最終的に関連付けられているリソースが解放されます。トランザクションの状態は影響を受けません。