Model.field.contains()
的SqlAlchemy文档在此处(ORM Internals - contains中)说:
在列上下文中,生成子句
LIKE '%<other>%'
但是,我发现我(google app eng cloudsql)db上的一些模型正在生成SQL 的正确形式以开头,但是,似乎在一些随机(?)之后时间段或触发器,开始始终如一地生成表格:
name LIKE '%%' || :name || '%%'
- 导致后续生成的查询获取所有可能的模型结果的表单。
我已经能够发出SQL(使用 How do I get a raw, compiled SQL query from a SQLAlchemy expression?)验证上述内容。
我的问题是:
因为我已经相当一致地使用contains
,所以我当然可以隐藏&#39;默认实现并将其替换为.ilike('%...%')
,这符合我的目的,但我希望不要这样做(丑陋的事情),如果有人有任何见解,我很好奇。
编辑:
首先......(对于那些只想测试发出的SQL输出差异的人)
发出的SQL(如上所述)仅为了方便我的测试,但提到所以任何人都可以按照我的尝试。为此,我应该澄清一下,我提到的上述链接使用的实际片段是:
def compile_query(query):
from sqlalchemy.sql import compiler
from MySQLdb.converters import conversions, escape
dialect = query.session.bind.dialect
statement = query.statement
comp = compiler.SQLCompiler(dialect, statement)
comp.compile()
enc = dialect.encoding
params = []
for k in comp.positiontup:
v = comp.params[k]
if isinstance(v, unicode):
v = v.encode(enc)
params.append( escape(v, conversions) )
return (comp.string.encode(enc) % tuple(params)).decode(enc)
请注意:简而言之,发布的代码(在MySQL Workbench上剪切,粘贴,执行时)与所有情况下的Web应用程序具有相同的结果(即:两者在两者之间保持一致&# 39;随机发出不一致的情况)。我很高兴假装sqlalchemy执行的代码与发出的代码相同,只是寻求帮助,试图理解发出的决定&#39;用似乎随机的时间创建'%%' ||...(etc)
古怪而不是LIKE '%keyword%' OR LIKE...
- 尽管再一次,&#39; %%&#39;选项&#39;设置在&#39;中,它在应用程序的生命周期中保持这种方式(即:直到重新启动Web应用程序)。
我希望清除一些事情。