python - 使用 Elixir 执行 sql 查询

标签 python postgresql sqlalchemy python-elixir

我在连接到 postgres 数据库的项目中使用 Elixir。我想在我连接的数据库上运行以下查询,但我不确定如何去做,因为我对 Elixir 和 SQLAlchemy 还很陌生。谁知道怎么做?

VACUUM FULL ANALYZE 表

更新

错误是:“UnboundExecutionError:无法找到在 SQL 表达式或此 session 上配置的绑定(bind)”。与之前发出的 session.close() 相同的结果。我确实尝试过执行 metadata.bind.execute() 并且它适用于简单的选择。但对于 VACUUM,它说 - “InternalError: (InternalError) VACUUM cannot run inside a transaction block”,所以现在我想弄清楚如何关闭它。

更新 2

我可以让查询执行,但我仍然遇到同样的错误 - 即使我创建了一个新 session 并关闭了前一个 session 。

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker

# ... insert stuff
old_session.commit()
old_session.close()

new_sess = sessionmaker(autocommit=True)
new_sess.configure(bind=create_engine('postgres://user:pw@host/db', echo=True))
sess = new_sess()
sess.execute('VACUUM FULL ANALYZE table')
sess.close()

我得到的输出是

2009-12-10 10:00:16,769 INFO sqlalchemy.engine.base.Engine.0x...05ac VACUUM FULL ANALYZE table
2009-12-10 10:00:16,770 INFO sqlalchemy.engine.base.Engine.0x...05ac {}
2009-12-10 10:00:16,770 INFO sqlalchemy.engine.base.Engine.0x...05ac ROLLBACK
finishing failed run, (InternalError) VACUUM cannot run inside a transaction block
 'VACUUM FULL ANALYZE table' {}

更新 3

感谢所有回复的人。 我找不到我想要的解决方案,但我想我会选择此处描述的解决方案 PostgreSQL - how to run VACUUM from code outside transaction block? .这并不理想,但它确实有效。

最佳答案

该死。我知道答案就在我眼皮底下。假设您像我一样设置连接。

metadata.bind = 'postgres://user:pw@host/db'

解决这个问题很简单

conn = metadata.bind.engine.connect()

old_lvl = conn.connection.isolation_level
conn.connection.set_isolation_level(0)
conn.execute('vacuum analyze table')
conn.connection.set_isolation_level(old_lvl)

这与此处建议的相似 PostgreSQL - how to run VACUUM from code outside transaction block? 因为在这一切之下,sqlalchemy 使用 psycopg 与 postgres 建立连接。 Connection.connection 是 psycopg 连接的代理。一旦我意识到这一点,这个问题又回到了我的脑海,我决定再试一次。

希望这对某人有帮助。

关于python - 使用 Elixir 执行 sql 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1875885/

相关文章:

python - 在较大的 PyCharm 或 IntelliJ 项目中是否支持具有自己的 virtualenvs 的子目录?

python - 使用 Django 的非阻塞 Thrift-Server

sql - postgres 的数据文件夹的权限应该是什么

ruby-on-rails - 是否可以使用 postgres 将 Rails 项目从 Windows 部署到 Linux 服务器?

python - 如何使远程执行的 pexpect spawn 在继续之前完全等待命令解决?

python - 如果,elif,否则故障?

c# - 以表格格式返回多个 PostgreSQL 值

python - 如何使用 SQLAlchemy 处理两阶段提交

python - SQLAlchemy 按分钟分组

python - SQLite 中的文件锁