我在连接到postgres数据库的项目中使用Elixir。我想在连接的数据库上运行以下查询,但是由于我对Elixir和SQLAlchemy比较陌生,因此我不确定如何执行此查询。有人知道吗?
VACUUM FULL ANALYZE table
更新

错误为:“UnboundExecutionError:无法找到在SQL表达式或此Session上配置的绑定(bind)”。与之前发布的session.close()的结果相同。我确实尝试过做metadata.bind.execute(),这对于一个简单的选择是有用的。但是对于VACUUM,它说-“InternalError:(InternalError)VACUUM无法在事务块内运行”,所以现在我试图弄清楚如何将其关闭。

更新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?所述的解决方案。这不是理想的方法,但确实可行。

最佳答案

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

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/

10-09 17:11