SqlAlchemy Model.field.contains()似乎生成了错误的SQL? (QueryableAttribute)

时间:2016-05-23 08:52:28

标签: python sqlalchemy contains google-cloud-sql google-app-engine-python

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?)验证上述内容。

我的问题是:

  • 是否有其他人(已经......已经解决了)类似的问题?
  • 或者......任何人都可以验证这是cloudql + sqlalchemy + mysql(方言)的问题吗?

因为我已经相当一致地使用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应用程序)。

我希望清除一些事情。

0 个答案:

没有答案