web-dev-qa-db-ja.com

Python psycopg2がpostgresqlテーブルに挿入しない

次を使用して、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"
28
Superdooperhero

各エントリをデータベースにコミットする必要がない場合は、次の行を追加できます。

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"
57
aright

最後にconn.commit()が必要でした

32
Superdooperhero

psycopg2Python DB API -に準拠しているため、自動コミット機能はデフォルトでオフになっています。呼び出す必要があります conn.commit 保留中のトランザクションをデータベースにコミットします。接続(およびカーソル)はコンテキストマネージャーなので、単にwithステートメントを使用して、コンテキストを離れるときにトランザクションを自動的にコミット/ロールバックできます。

with conn, conn.cursor() as cur:  # start a transaction and create a cursor
    cur.execute(sql)

docs から:

接続がwithブロックを終了するときに、ブロックによって例外が発生していない場合、トランザクションはコミットされます。例外の場合、トランザクションはロールバックされます。

カーソルがwithブロックを終了すると、カーソルは閉じられ、最終的に関連付けられているリソースが解放されます。トランザクションの状態は影響を受けません。

7
Eugene Yarmash