68

tornadoからpostgresにJSONデータを挿入する必要があるので、次のようなテストを行います。

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)

Pythonシェルで実行した後にわかるようにselect、いくつかのデータがありますが、psqlには0行があります!私は何を間違っているのでしょうか?

Python 2.7.2 +

4

2 に答える 2

229

トランザクションをコミットしませんでした。

Psycopg2はトランザクションを自動的に開きます。データを他のセッションで表示できるようにするには、コミットするように指示する必要があります。

psycopg2のFAQconnection.commit()方法を参照してください。

于 2012-12-05T03:28:47.190 に答える
4

同じ厄介な問題がありました。オプションをまとめるには:

@Craig Ringerがcursor.executeの後に書き込むように、connection.commitを実行できます

cursor.execute('INSERT INTO table VALUES(DEFAULT, %s)', email)
...
connection.commit()

または接続後setautocommit

connection = connect("user='pguser' host='localhost' dbname='pgdb' password='pgpass'")
connection.autocommit = True

または、set_sessionを使用して自動コミットを設定します

connection = connect("user='pguser' host='localhost' dbname='pgdb' password='pgpass'") 
connection.set_session(autocommit=True)

すべてが私のために働いた。

于 2020-11-02T20:53:15.783 に答える