我有一个已添加为SQLAlchemy的before_execute回调的函数,如下所示:
event.listen(self.app_engine, "before_execute", self.before_exec)
在此回调中,我试图提取将要执行的语句的字符串表示形式。我了解到这并不完全是微不足道的-问题似乎来自基于ORM的查询,而不是有效的核心查询。
在编译基于ORM的查询时,遇到以下错误:
sqlalchemy.exc.CompileError: Bind parameter 'widget_id' without a renderable value not allowed here.
before_execute的multiparams参数是为ORM查询而不是核心查询填充的。因此,我尝试了以下操作:
clauseelement.values(**multiparams[0][0]).compile(compile_kwargs={"literal_binds": True})
但是不幸的是,这只会导致:
sqlalchemy.exc.CompileError: Unconsumed column names: widget_id
我不太了解如何存储或处理参数,尤其是当您在ORM中分层时。我已经阅读了一些SQLAlchemy资料以及我可以在网上找到的所有资料,但是运气还不是很好。
这是无效的较大代码上下文:
def before_exec(self, conn, clauseelement, multiparams, params):
if not isinstance(clauseelement, (dml.Delete, dml.Update)):
return
query = select([clauseelement.table])
if clauseelement._whereclause is not None:
query = query.where(clauseelement._whereclause)
stmt_redo = clauseelement.compile(compile_kwargs={"literal_binds": True})
有效的核心样式查询:
self.session.query(Widget).filter_by(name="Foo").update({"name": "Baz"})
基于ORM的查询无效:
widget = self.session.query(Widget).filter_by(name="Foo").first()
widget.name = "Baz"
self.session.add(widget)
self.session.commit()
谢谢您的时间!