где () не обрабатывает параметры, как ожидалось в sqlalchemy - PullRequest
0 голосов
/ 19 сентября 2018
table = engine.getFTable();
dBtable = table; 
query = select([dBtable.c.id]).where( dBtable.c.FName == 'F1' );
print(query);

Получается правильная таблица, но по какой-то причине построенный запрос не соответствует ожиданиям.Ниже приведен запрос, построенный

SELECT "FList".id 
FROM "FList" 
WHERE "FList"."FName" = ?

вместо

SELECT "FList".id 
FROM "FList" 
WHERE "FList"."FName" = 'F1'

1 Ответ

0 голосов
/ 19 сентября 2018

SQLAlchemy создает параметризованные SQL-запросы , когда это возможно.

Это означает, что ? в ваших запросах WHERE - это просто заполнитель, который будет заполнен фактическими данными ('F1') при выполнении запроса (параметры связаны с запросом).

Точный синтаксис заполнителя связанного параметра зависит от диалекта SQLвы используете (PostgreSQL, MySQL, ...).Некоторые используют ?, некоторые поддерживают именованные параметры, такие как :user_id.

Вы можете увидеть параметры, которые будут заполнены путем компиляции этого объекта запроса и отображения его параметров:

>>> query = select([table.c.userid]).where(table.c.userid == 'lukas.graf')
>>> print query
SELECT users.userid
FROM users
WHERE users.userid = :userid_1            <---- bind parameter placeholder

>>> compiled = query.compile()
>>> print compiled.params
{u'userid_1': 'lukas.graf'}

В документации SQLAlchemy объясняется, как отображать выражения SQL в виде строк, если вам необходимо их отладить:

>>> from sqlalchemy.dialects import postgresql
>>>
>>> query = select([table.c.userid]).where(table.c.userid == 'lukas.graf')
>>> compiled = query.compile(dialect=postgresql.dialect(), compile_kwargs={"literal_binds": True})
>>> print compiled
SELECT users.userid
FROM users
WHERE users.userid = 'lukas.graf'

Также обратите внимание на отрывок из этой документации:

Приведенные выше формы будут отображать оператор SQL при его передаче в DBAPI Python, который включает в себя то, что связанные параметры не отображаются встроенными.SQLAlchemy, как правило, не приводит к строковым параметрам привязки, так как это обрабатывается соответствующим образом с помощью DBAPI Python, не говоря уже о том, что обход ограниченных параметров является, вероятно, наиболее широко используемой дырой в безопасности в современных веб-приложениях.

Значение, параметризованноезапрос и, отдельно, параметры для привязки к нему будут передаваться в DBAPI Python (если хотите, «драйвером БД»), потому что это наиболее эффективный и безопасный способ выполнения задач.Вы можете визуализировать запрос с помощью встроенных параметров, как показано выше, но это не совсем то, что происходит по проводам.


Вместо этого, если вы отлаживаете свои запросы, вам лучше использовать echo=True параметр для механизма : Это удобно регистрирует оба параметризованных запроса по мере их выполнения, и их связанные параметры.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...