.execute(' INSERT ...')实际上并没有将数据插入表中

时间:2014-06-27 12:25:36

标签: python postgresql postgresql-9.1 sql-insert psycopg2

警告脑屁即将来临

我现在已经有一段时间了,而且我猜这只是一个“我累了,无法通过我的头脑”这类问题所以我希望你能打破这个对我来说..

我会向后解释这个因为它更有意义......

我通过执行以下操作验证了我的表的内容:

SELECT DISTINCT DATE(time) AS UNIQUE_DATES FROM reports;

我期待:

2014-06-17
2014-06-16

17失踪了..
所以我自然会通过以下方式检查query_string

import psycopg2
database = psycopg2.connect(dbname=database, user=user, password=password, database=database)
cursor = database.cursor()
query_string = b"INSERT INTO reports (time) VALUES " + b','.join(cursor.mogrify('(%s)', value) for value in values) + b';')
print(query_string)
cursor.execute(query_string)

导致:

b"INSERT INTO reports(time) VALUES ('2014-06-17 10:00:08'),('2014-06-17 14:00:05');"

没有错误信息。
瞧,如果查询:

SELECT * FROM pg_stat_activity;

显示INSERT。 (考虑到查询进入<IDLE>状态的速度有多快,所有这些都是随机时间...但它就在那里)

但话说回来,它不在数据库中..这怎么可能? 如果我接受命令并在psql执行它,我自己肯定已插入..

没有任何意义..如果另一个PID实际上正在数据库上执行执行是有意义的,我无法真正说这是因为最后SELECT显示没有活动会话,它们是都闲着..

1 个答案:

答案 0 :(得分:4)

您需要提交交易:

connection.commit()

请参阅psycopg2文档的Transactions control section

psql以不同的交易模式运作;它会自动提交所有语句。来自psql documentation

  

AUTOCOMMIT
  启用(默认值)时,每个SQL命令在成功完成后自动提交。要在此模式下推迟提交,您必须输入BEGINSTART TRANSACTION SQL命令。关闭或取消设置时,在明确发出COMMITEND之前,不会提交SQL命令。