Ответ 1
Учебник дает довольно хороший пример:
>>> from sqlalchemy.sql import text
>>> s = text(
... "SELECT users.fullname || ', ' || addresses.email_address AS title "
... "FROM users, addresses "
... "WHERE users.id = addresses.user_id "
... "AND users.name BETWEEN :x AND :y "
... "AND (addresses.email_address LIKE :e1 "
... "OR addresses.email_address LIKE :e2)")
SQL>>> conn.execute(s, x='m', y='z', e1='%@aol.com', e2='%@msn.com').fetchall()
[(u'Wendy Williams, [email protected]',)]
Сначала возьмите строку SQL и передайте ее sqalchemy.sql.text(). Это не обязательно, но, вероятно, хорошая идея...
Преимущества text(), предоставляемые по простой строке, являются нейтральными поддержка параметров привязки, параметры выполнения для каждого оператора, а также в качестве параметра привязки и типизации типа результата-столбца, что позволяет Конструкции типа SQLAlchemy, чтобы играть роль при выполнении инструкции это указано буквально.
Обратите внимание, что даже если вы не использовали text()
, вы НИКОГДА не должны просто использовать sql.format(...)
. Это приводит к большему риску атаки SQL injection.
Далее вы можете указать фактические аргументы с использованием параметров ключевого слова для функции execute(), которую вы уже использовали.
Теперь в вашем примере у вас есть функция, которая обертывает функциональность выполнения. Поэтому, если вы хотите использовать это для нескольких запросов, вам нужно будет сделать параметры доступными для получения ваших аргументов. Вы можете сделать это довольно просто, как словарь:
def _sql_to_data(sql, values):
...
conn.execute(sql, values)
values
будет словарем. Тогда вы можете использовать свою функцию следующим образом:
sql = 'SELECT ...'
data = { 'user_id' : 3 }
results = _sql_to_data(sql, data)
Использование ключевых слов в качестве ваших параметров - всего лишь один из способов указания аргументов функции execute()
. Вы можете читать документацию для этой функции несколькими способами.