python
  • postgresql
  • insert
  • psycopg2
  • 2013-08-05 43 views 21 likes 
    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

    警告:'除了:'子句捕獲沒有特定的異常對調試代碼沒有任何幫助。 – bernie

    回答

    44

    如果不想有犯每個條目的數據庫,您可以添加以下行:

    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

    嗨aright,你知道如果你沒有將autocommit設置爲True並且你永遠不會提交會發生什麼?看起來表格的順序是遞增的,但行的位置在哪裏? –

    +0

    @DanielBaughman:這是因爲即使你沒有提交,序列也會增加;見例如[不受交易影響的序列? ](https://stackoverflow.com/questions/2095917/sequences-not-affected-by-transactions) – user1071847

    26

    原來我需要conn.commit()

    2

    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塊時,它將關閉,釋放最終與其關聯的任何 資源。交易 的狀態不受影響。

    相關問題