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

标签 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显示没有事件 session ,它们都处于空闲状态..

最佳答案

您需要提交交易:

connection.commit()

参见 Transactions control section psycopg2 文档。

psql 以不同的事务模式运行;它自动提交所有语句。来自psql documentation :

AUTOCOMMIT
When on (the default), each SQL command is automatically committed upon successful completion. To postpone commit in this mode, you must enter a BEGIN or START TRANSACTION SQL command. When off or unset, SQL commands are not committed until you explicitly issue COMMIT or END.

关于python - .execute ('INSERT ...' ) 实际上并没有往表中插入数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24451808/

相关文章:

python - python 类中的方法可以用子类定义的类型进行注释吗?

python - 使用 Django auth 用户模型作为外键和反向关系

python - Keras/Tensorflow 中的时间分布

sql - 数组的 JSONB 子集

java - 如何为数据库查找创建变量模式匹配?

postgis - 尝试为 postgis 创建模板数据库 postgresql 时出现问题

postgresql - 使用参数而不是硬编码字符串时,Postgres 查询非常慢

python - 如何查找两列中的值是否在 Pandas 数据框中反向出现

python - Django - 从 Sqlite3 迁移到 Postgresql

sql - 为什么 count(*) 在此子查询 (postgresql) 中返回多个结果?