我在连接到 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/