如何从sqlalchemy执行SET语句?

1 投票
1 回答
1609 浏览
提问于 2025-04-17 17:09

我正在尝试通过sqlalchemy执行SET语句。

>>> from sqlalchemy import create_engine
>>> c = create_engine('postgres://myuser@myremoteserver/mydb?keepalives_idle=4&keepalives_interval=1&keepalives_count=5')
>>> c.execute('SET statement_timeout=1000')
<sqlalchemy.engine.base.ResultProxy object at 0xb7b250>

这会返回一个ResultProxy对象。但是statement_timeout的值没有被设置。

>>> c.execute('SHOW statement_timeout').scalar()
'0'

如果我尝试使用ResultProxy.scalar,那么就会出现错误。

>>> c.execute('SET statement_timeout=1000').scalar()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.6/site-packages/sqlalchemy/engine/base.py", line 1676, in scalar
    self.connection._handle_dbapi_exception(e, None, None, self.cursor, self.context)
  File "/usr/lib/python2.6/site-packages/sqlalchemy/engine/base.py", line 923, in _handle_dbapi_exception
    self.invalidate(e)
  File "/usr/lib/python2.6/site-packages/sqlalchemy/engine/base.py", line 633, in invalidate
    raise exc.InvalidRequestError("This Connection is closed")
sqlalchemy.exc.InvalidRequestError: This Connection is closed

我该如何为这个变量设置值呢?

1 个回答

1

有两个观察点。

首先,你的错误提示表明你可能在尝试使用一个已经关闭的连接。是不是有可能在后台发生了一些奇怪的连接池问题,或者连接在某个时候被关闭了?

其次,你的第二个查询没有返回任何值。

仔细看,你的第一个方法似乎是有效的,只是因为语句没有返回任何东西,所以 ResultProxy 没有被设置为一个值。你可能只想丢弃它,然后运行 SHOW 命令来获取应用程序需要的值。

撰写回答