没有实际插入数据

我需要将来自龙卷风的 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)

正如您在 pythonshell 中执行 select之后所看到的,有一些数据,但是在 psql 中有 0行! 我可能做错了什么?

Python 2.7.2 +

38835 次浏览

你没有提交交易。

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

参见 心理学常见问题connection.commit()

只是有一个同样令人困惑的问题,把选择放在一起:

正如@Craig Ringer 在 cursor 后面写的那样,可以运行 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

或者 使用 set _ session 设置自动提交

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

都对我有用。