SQLAlchemy的顺序中的转义字符串

2024-10-01 04:45:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我最近在SQLAlchemy+Postgres代码中发现了一个bug,如果传递一个特殊字符作为查询,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"

为什么第一个查询被正确转义,而第二个查询却没有转义。从这个意义上说,在SQLAlchemy中处理这种字符串插值的最佳方法是什么?你知道吗


Tags: to字符串textnamesqlalchemyvaluemytablepostgres