SQLAlchemy before_execute和绑定参数

时间:2019-04-24 14:38:36

标签: python sqlalchemy

我有一个已添加为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()

谢谢您的时间!

0 个答案:

没有答案