moz*_*ves 5 python postgresql sqlalchemy python-elixir
我在一个连接到postgres数据库的项目中使用Elixir.我想在我连接的数据库上运行以下查询,但我不知道该怎么做,因为我对Elixir和SQLAlchemy很新.谁知道怎么样?
VACUUM FULL ANALYZE table
更新
错误是:"UnboundExecutionError:无法找到在SQL表达式或此会话上配置的绑定".与之前发布的session.close()相同的结果.我确实尝试过metadata.bind.execute(),这对于一个简单的选择很有用.但对于VACUUM,它说 - "InternalError:(InternalError)VACUUM无法在事务块内运行",所以现在我正在试图弄清楚如何关闭它.
更新2
我可以让查询执行,但我仍然得到相同的错误 - 即使我创建一个新会话并关闭前一个会话.
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()
Run Code Online (Sandbox Code Playgroud)
我得到的输出是
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' {}
Run Code Online (Sandbox Code Playgroud)
更新3
感谢大家的回应.我无法找到我想要的解决方案,但我想我会选择PostgreSQL中描述的解决方案- 如何从事务块外部的代码运行VACUUM?.它并不理想,但它有效.
moz*_*ves 10
该死.我知道答案就在我的鼻子底下.假设您像我一样设置连接.
metadata.bind = 'postgres://user:pw@host/db'
Run Code Online (Sandbox Code Playgroud)
对此的解决方案很简单
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)
Run Code Online (Sandbox Code Playgroud)
这类似于PostgreSQL中的建议- 如何从事务块外的代码运行VACUUM? 因为在它之下,sqlalchemy使用psycopg建立与postgres的连接.Connection.connection是psycopg连接的代理.一旦我意识到这一点,这个问题又浮现在脑海中,我决定再次采取行动.
希望这有助于某人.
| 归档时间: |
|
| 查看次数: |
3775 次 |
| 最近记录: |