请考虑以下示例代码:
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
视为参数,这不是我想要的。
是否可以阻止SQLAlchemy在语句中搜索和替换参数?
答案 0 :(得分:0)
您是否考虑在examples from docs上使用from_statement
,然后在之后应用限制?
我注意到您使用sqlite
作为引擎,这是打印查询中?
的最可能原因。它的定义与SQLAlchemy SQLite方言(sqlalchemy/dialects/sqlite/base.py
) - qmark
中的定义类似。不同的方言有不同的定义。你在named
之后。参考:
PEP-249
您可以尝试:
from sqlalchemy.dialects import sqlite
query = stmt.compile(dialect=sqlite.dialect(paramstyle="named"))
答案 1 :(得分:0)
好的,我找到了解决方案。结果(并且在text
函数的文档字符串中给出),冒号可以使用\:
进行转义。然后text
将像通常的冒号一样处理它们并在编译时删除转义。即原始示例可以修复如下:
stmt = select([text("some_function(':x')".replace(':', r'\:'))])