是否可以发出“VACUUM ANALYZE ”来自 psycopg2 或 sqlalchemy for PostgreSQL?
嗯,这个问题几乎概括了这一点。我的数据库活动更新密集,我想以编程方式发出 Vacuum 分析。但是我收到一条错误,指出查询无法在事务中执行。还有其他方法吗?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
这是 Python DB-API 中的一个缺陷:它为您启动一个事务。它不应该这样做;是否以及何时开始事务应该由程序员决定。像这样的低级核心 API 不应该照顾开发人员并在我们背后执行诸如启动事务之类的事情。我们是大男孩了——我们可以自己开始交易,谢谢。
使用 psycopg2,您可以通过 API 扩展禁用这种不幸的行为:运行
connection.autocommit = True
。不幸的是,没有标准的 API 可以实现这一点,因此您必须依赖非标准扩展来发出必须在事务外部执行的命令。没有一种语言是没有缺点的,Python 就是其中之一。我以前也被这个咬过。
This is a flaw in the Python DB-API: it starts a transaction for you. It shouldn't do that; whether and when to start a transaction should be up to the programmer. Low-level, core APIs like this shouldn't babysit the developer and do things like starting transactions behind our backs. We're big boys--we can start transactions ourself, thanks.
With psycopg2, you can disable this unfortunate behavior with an API extension: run
connection.autocommit = True
. There's no standard API for this, unfortunately, so you have to depend on nonstandard extensions to issue commands that must be executed outside of a transaction.No language is without its warts, and this is one of Python's. I've been bitten by this before too.
您可以使用 SQLAlchemy 的 autocommit 模式="noreferrer">raw_connection(这将为您提供“原始”psycopg2 连接):
You can turn on Postgres
autocommit
mode using SQLAlchemy's raw_connection (which will give you a "raw" psycopg2 connection):不确定旧版本的 SQLAlchemy,但使用最新版本(1.4.x 或更高版本),您可以创建自动提交会话,而无需处理原始连接或依赖于数据库特定的黑客:
自动提交引擎可以从任何
Engine 派生对象。旧的
Engine
实例仍然有效。Not sure about older versions of SQLAlchemy, but with a recent version (1.4.x or higher) you can create an autocommit session, without handling raw connections or relying on database specific hacks:
The autocommit engine can be derived from any
Engine
object. The oldEngine
instance remains functional.