2013-08-05 24 views
21

私は以下の方法でpostgresqlデータベーステーブルにレコードを挿入しようとしていますが、動作しません。私はエラーはありませんが、テーブルにはレコードがありません。私はコミットか何かが必要ですか? Bitnami djangostackのインストールでインストールされたpostgresqlデータベースを使用しています。Python psycopg2が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" 
+3

警告:特定の例外を捕まえない 'except:'句は、コードのデバッグにまったく役に立たない。 – bernie

答えて

44

conn.commit()を必要と判明:あなたの

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" 
+0

こんにちは、自動コミットがTrueに設定されておらず、決してコミットしないとどうなりますか?テーブルのシーケンスはインクリメントされるようですが、行はどこにありますか? –

+0

@DanielBaughman:あなたがコミットしなくてもシーケンスが増分するためです。例えば、 [トランザクションの影響を受けないシーケンス? ](https://stackoverflow.com/questions/2095917/sequences-not-affected-by-transactions) – user1071847

26

データベースへの各エントリをコミットしたくない場合は、次の行を追加することができ、私は最後

2

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

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

docsから:

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

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