Недавно я обнаружил ошибку в своем коде 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 в целом?