SQLAlchemy:在查询编译期间阻止参数替换

时间:2018-01-19 15:19:11

标签: python 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视为参数,这不是我想要的。

是否可以阻止SQLAlchemy在语句中搜索和替换参数?

2 个答案:

答案 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'\:'))])
相关问题