POSTGRES - 使用psycopg在单个事务中进行多个操作。

问题描述 投票:0回答:1

我有一个查询,我想在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 也可以回滚吗?

谢谢你。

sql postgresql psycopg2 postgresql-9.1
1个回答
1
投票

整个事务将被回滚。你可以添加一个 select 1/0; 语句,然后通过一个单独的连接(用psql也可以)检查数据是否没有改变,以确认这一点。

(psycopg2确实有一个自动提交选项,可以在每条语句后执行一次提交,但它默认是关闭的,我从来没有看到它在实际应用中被使用。)

© www.soinside.com 2019 - 2024. All rights reserved.