2013-08-05 15 views
21

Sto usando quanto segue per provare a inserire un record in una tabella del database postgresql, ma non funziona. Non ricevo errori, ma non ci sono record nella tabella. Ho bisogno di un commit o qualcosa del genere? Sto usando il database postgresql che è stato installato con l'installazione di djangostack Bitnami.Python psycopg2 non si inserisce nella tabella 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

Avvertenza: le clausole 'except:' che non rilevano alcuna eccezione specifica non sono affatto utili nel codice di debug. – bernie

risposta

44

Se non vogliono avere a impegnarsi ogni voce al database, è possibile aggiungere la seguente riga:

conn.autocommit = True 

Quindi la tua codice risultante sarebbe:

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

Ciao a buon fine, sai cosa succede se non hai impostato l'autocommit su True e non ti impegni mai? Sembra che la sequenza della tabella aumenti, ma dove sono le file? –

+0

@DanielBaughman: È perché le sequenze aumentano anche se non si esegue il commit; vedere per es. [Sequenze non influenzate dalle transazioni? ] (https://stackoverflow.com/questions/2095917/sequences-non-affected-by-transactions) – user1071847

2

psycopg2 è Python DB API - compatibile, quindi la funzione di auto-commit è disattivata per impostazione predefinita. È necessario chiamare conn.commit per impegnare qualsiasi transazione in sospeso nel database. Come connessioni (e cursori) sono responsabili di contesto, si può semplicemente utilizzare l'istruzione with per commettere automaticamente/rollback di una transazione di lasciare il contesto:

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

Dal docs:

Quando un uscite di collegamento il blocco with, se nessuna eccezione è stata generata dal blocco, la transazione viene confermata. In caso di , la transazione viene ripristinata.

Quando un cursore esce dal blocco with, viene chiuso, rilasciando qualsiasi risorsa eventualmente associata ad esso. Lo stato della transazione non è interessato.

Problemi correlati