Python psycopg2没有实际插入数据

Python psycopg2没有实际插入数据,python,postgresql,psycopg2,Python,Postgresql,Psycopg2,我需要将tornado中的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):

我需要将tornado中的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)
正如您在python shell中执行select后所看到的,有一些数据,但在psql中有一些数据 0行!我可能做错了什么


Python 2.7.2+

您没有提交事务

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


See和。

也有同样令人困惑的问题。要将选项组合在一起:

当@Craig Ringer在cursor.execute之后写入时,您可以运行connection.commit

cursor.execute('INSERT INTO table VALUES(DEFAULT, %s)', email)
...
connection.commit()
或 连接后设置自动提交

connection = connect("user='pguser' host='localhost' dbname='pgdb' password='pgpass'")
connection.autocommit = True
connection = connect("user='pguser' host='localhost' dbname='pgdb' password='pgpass'") 
connection.set_session(autocommit=True)
或 使用set_会话设置自动提交

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

所有这些都为我工作。

将数据库pgdb的所有权限授予pguser;而在hba.conf中将对等点更改为信任并没有帮助,这两种尝试都是为了解决您没有遇到的问题。如果其中任何一个是问题,你都会得到权限错误。有些答案值100票——即使4年后。这是其中之一!:@rjurney请向psycopg2存储库提交一个pull请求以添加它,然后:在您希望在文档中找到它的最合理的位置。对于其他担心他们可能一直忘记这一步骤的人:它也可能有助于将会话的autocommit设置为True:faq还应该提醒在会话中使用连接的区别使用语句或游标…:Re:with语句:在with块结束时,假设未发生错误,将自动执行提交。请注意,连接保持打开状态。对于那些发现自己在这里却不知道的人: