首页 > 解决方案 > 如何让 SQLAlchemy session.execute 在替换参数时不向字符串添加单引号?

问题描述

我在一个更大的语句中有这段 SQL,我需要替换两个变量:

jsonb_pretty(jsonb_build_object('analysis_config', jsonb_agg(
            case value->>'name'
            when :old_name then value || '{"name": ":new_name"}'
            else value
            end
        ))

问题是,当我确实session.execute(statement, params={"old_name": old_name, "new_name": new_name}) new_name被单引号包围时,它就不起作用了。它需要用双引号明确括起来(我试图通过如上所述添加它们来做到这一点)。fstring 完美地工作,但我们不想在这里这样做。有什么简单的方法可以做到吗?谢谢!

标签: pythonpostgresqlsqlalchemy

解决方案


一种选择是将整个 JSON 字符串作为值传递。代替

when :old_name then value || '{"name": ":new_name"}'

利用

when :old_name then value || :new_name

并将编码字符串作为值传递:

import json

session.execute(
    statement,
    params={
        "old_name": old_name,
        "new_name": json.dumps({"name": new_name})
    })

推荐阅读