psycopg2实际上并没有插入数据

juk*_*juk 52 python postgresql psycopg2

我需要将龙卷风中的JSON数据插入到postgres中,所以这里的测试如下:

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)
Run Code Online (Sandbox Code Playgroud)

正如你select在python shell中看到的那样,有一些数据,但在psql中有0行!我可能做错了什么?

Python 2.7.2+

Cra*_*ger 159

您没有提交交易.

Psycopg2会自动打开一个事务,您必须告诉它提交才能使数据对其他会话可见.

请参阅psycopg2常见问题解答connection.commit()方法.

  • 一些答案值得100票,即使在4年后也是如此.这是其中之一!:) (10认同)
  • 教程和文档没有说明这一点,谢谢! (4认同)
  • 对于其他人担心他们可能会忘记这一步:它也可能用于为会话设置`autocommit`为'True`:http://initd.org/psycopg/docs/connection.html#connection.set_session (2认同)

frm*_*elz 8

刚刚遇到了同样令人困惑的问题。将选项放在一起:

正如@Craig Ringer在cursor.execute之后写道,你可以运行connection.commit

cursor.execute('INSERT INTO table VALUES(DEFAULT, %s)', email)
...
connection.commit()
Run Code Online (Sandbox Code Playgroud)

或者连接后设置自动提交

connection = connect("user='pguser' host='localhost' dbname='pgdb' password='pgpass'")
connection.autocommit = True
Run Code Online (Sandbox Code Playgroud)

或者使用 set_session 设置自动提交

connection = connect("user='pguser' host='localhost' dbname='pgdb' password='pgpass'") 
connection.set_session(autocommit=True)
Run Code Online (Sandbox Code Playgroud)

一切都为我工作。