python pyscopg2无事务

f45qwnt8  于 2022-12-10  发布在  Python
关注(0)|答案(1)|浏览(175)

有时我需要从psycopg 2执行一个查询,而这个查询 * 不在 * 事务块中。
例如:

cursor.execute('create index concurrently on my_table (some_column)')

不起作用:

InternalError: CREATE INDEX CONCURRENTLY cannot run inside a transaction block

我看不出有什么简单的方法可以用psycopg 2来做到这一点。我错过了什么?
我可能可以调用os.system('psql -c "create index concurrently"')或类似的东西来让它从我的python代码中运行,但是如果能够在python中运行它而不依赖psql来实际位于容器中,那就更好了。
是的,对于这个特定的用例,我必须使用concurrently选项。
另一次我探索这个问题但没有找到明显答案的情况是,我有一组sql命令,我想用一个execute()调用这些命令,其中第一个命令暂时锁定一个资源。该资源将在execute()的整个持续时间内保持锁定一笔大买卖。
在这种情况下,我可以将查询分解为一系列execute()语句--每个语句都成为自己的事务,这是可以的。
似乎应该有一个办法,但我似乎错过了它。希望这是一个简单的答案有人。

2eafrhcq

2eafrhcq1#

根据psycopg2文档:

  • 可以将连接设置为自动提交模式:这样,所有执行的命令都将立即提交,并且不可能回滚。一些命令(例如CREATE DATABASE、VACUUM、使用事务控制对存储过程进行调用...)需要在任何事务之外运行:为了能够从Psycopg运行这些命令,连接必须处于自动提交模式:您可以使用autocommit属性。*

于是在连接上:conn.set_session(autocommit=True)
来自psycopg2文档的更多资源:
事务控制
connection.autocommit

相关问题