我有一个查询,我想在postgres中运行。
它先删除,然后插入(有点实现了一种丑陋的upserting方式,不幸的是在我的方案中需要)。
cursor, connection = get_pgsql_connection(...)
query = '''
delete from table where name = 'xyz';
insert into table (name, value, place) values
('A', 1, 0),
('B', 4, 1),
('C', 6, 2);
'''
cursor.execute(query)
connection.commit()
connection.close()
问题是:如果在这个查询中由于任何原因失败,那么整个操作(即 delete
+ insert
)是中止的?例如,如果 delete
失败,是否会中止插入?或者类似地,当其中一个 insert
失败,会不会 delete
也可以回滚吗?
谢谢你。
整个事务将被回滚。你可以添加一个 select 1/0;
语句,然后通过一个单独的连接(用psql也可以)检查数据是否没有改变,以确认这一点。
(psycopg2确实有一个自动提交选项,可以在每条语句后执行一次提交,但它默认是关闭的,我从来没有看到它在实际应用中被使用。)