我最近在我的SQLAlchemy + Postgres代码中发现了一个错误,该错误中如果传递特殊字符作为查询Postgres将失败。搜索失败的字符串是nationality'
,并带有单引号结尾,该字符需要在Postgres中使用nationality''
进行转义。但是我想保护自己免受其他特殊字符的伤害,所以我最终想到了:
query = "nationality'"
q = text("""
defi_to_vector(mytable.name,
mytable.description,
mytable.tags,
mytable.meta) @@
to_tsquery('english', :searchquery)
""").bindparams(bindparam('searchquery', value=query))
qs = session.query(MyTable).filter(q)
现在这有效,并且转义了我相信的字符串,因为它没有失败。它在以下行中失败:
qs = qs.order_by(
text("mytable.name = :query DESC").bindparams(bindparam('query', value=query))
)
错误:
sqlalchemy.exc.ProgrammingError: (psycopg2.ProgrammingError) unterminated quoted string at or near "'nationality'' DESC, mytable.name) AS anon_1"
如何正确地对第一个查询进行转义,而对第二个order_by
却无法正确转义。从这种意义上讲,一般来说,在SQLAlchemy中处理这种字符串插值的最佳方法是什么?