SQLAlchemy:如何阻止查询编译时的参数替换
解决SQLAlchemy意外替换
:x为参数的问题 遇到这种情况确实挺头疼的——SQLAlchemy自动把你字符串里的:x当成绑定参数处理了,完全不是你想要的结果。别担心,有两种简单的方法可以阻止它这么做:
方法1:用双冒号转义
如果你只是想保留单个冒号,直接把:x写成::x就行,SQLAlchemy会把双冒号解析成单个冒号输出:
from sqlalchemy import create_engine from sqlalchemy.sql import * e = create_engine("sqlite://") stmt = select([text("some_function('::x')")]) print(str(stmt.compile(e)))
输出结果:SELECT some_function(':x'),完全符合预期。
方法2:使用literal_text包裹纯文本内容
如果你希望这段SQL片段完全被当作纯文本处理,不触发任何参数解析逻辑,可以用literal_text来构建你的函数表达式:
from sqlalchemy import create_engine from sqlalchemy.sql import * e = create_engine("sqlite://") stmt = select([literal_text("some_function(':x')")]) print(str(stmt.compile(e)))
这种方式下,SQLAlchemy会原封不动地输出你编写的内容,不会做任何参数替换操作。
额外小建议
如果你的some_function是数据库的内置函数,更推荐用SQLAlchemy的func工具来调用,这样既符合ORM的使用规范,也能从根源上避免这类解析问题:
from sqlalchemy import func stmt = select([func.some_function(':x')])
当然,如果是必须使用固定字符串的场景,前面两种方法就足够解决你的问题啦。
内容的提问来源于stack exchange,提问作者KT.
相关产品推荐
相关产品推荐

