2012-12-05 10 views
34

ho bisogno di inserire i dati JSON dal tornado a Postgres, quindi ecco test come questo:psycopg2 in realtà non l'inserimento dei dati

from psycopg2 import connect 

conn = connect("user='pguser' host='localhost' dbname='pgdb' password='pgpass'") 
cursor = conn.cursor() 

data = '[{"id":"sdf","name":"wqe","author":"vb"}]' 

for row in eval(data): 
    print row 
    cursor.execute("""INSERT INTO books(id,name,author) VALUES('%s','%s','%s')""" % \ 
     (row['id'], row['name'], row['author']) 
) 

>>> cursor.execute("SELECT * FROM books") 
>>> cursor.fetchall() 
[('sdf', 'wqe', 'vb')] 
>>> 
$> psql -d pgdb -U pguser -W 
Password for user pguser: 
psql (9.1.6) 
Type "help" for help. 

pgdb=> select * from books; 
id | name | author 
----+------+-------- 
(0 rows) 

Come si può vedere dopo aver fatto select in guscio pitone, ci sono alcuni dati, ma in psql c'è 0 righe! Cosa posso fare di sbagliato?

Python 2.7.2+

+0

concessione di TUTTI I PRIVILEGI SUL DATABASE pgdb a pguser; e cambiare il peer di fiducia in hba.conf non ha aiutato – juk

+2

Entrambi sono tentativi di risolvere un problema che non si ha. Avresti errori di autorizzazione se uno di questi fosse un problema. –

risposta

103

Non è stato eseguito il commit della transazione.

Psycopg2 apre una transazione automaticamente e devi dirgli di eseguire il commit per rendere i dati visibili ad altre sessioni.

Vedere the psycopg2 FAQ e connection.commit() method.

+8

Alcune risposte valgono 100 voti - anche dopo 4 anni. Questo è uno di loro! :) –

+3

Il tutorial e i documenti non dicono nulla, grazie! – rjurney

+0

@rjurney Si prega di inviare una richiesta di pull al repository psycopg2 per aggiungerlo poi :) nel punto più logico che ci si aspetterebbe di trovarlo nei documenti. –