Python, SQLAlchemy передают параметры в соединении.выполнять

Я использую соединение SQLAlchemy.execute (sql) для преобразования результатов выбора в массив карт. Есть следующий код


def __sql_to_data(sql):
    result = []
    connection = engine.connect()
    try:
        rows = connection.execute(sql)
        for row in rows:
            result_row = {}
            for col in row.keys():
                result_row[str(col)] = str(row[col])
            result.append(result_row)
    finally:
        connection.close()
    return result

и, например,

__sql_to_data(sql_get_scan_candidate)
дает мне хорошую структуру данных (конечно, я использую это для небольших наборов данных). Но для добавления параметра в sql я в настоящее время использую формат, например
return __sql_to_data(sql_get_profile.format(user_id))

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

return __sql_to_data(sql_get_profile,user_id)

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, wendy@aol.com',)]

во-первых, возьмите строку SQL и передайте ее в sqalchemy.язык SQL.text (). В этом нет необходимости, но, возможно, это хорошая идея...

преимущества text () по сравнению с простой строкой являются бэкэнд-нейтральными поддержка параметров привязки, параметров выполнения каждого оператора, а также как параметр bind и поведение ввода столбца результата, позволяющее Тип с SQLAlchemy конструкции играют важную роль при выполнении инструкции это уточняется буквально.

обратите внимание, что даже если вы не используете text(), вы никогда не должны просто использовать sql.format(...). Это приводит к большему риску SQL-инъекций атаки.

Далее, вы можете указать фактические параметры, используя параметры сайта на execute () функция, которую вы уже использовали.

теперь, в вашем примере, у вас есть функция, которая обертывает выполнить функциональность. Поэтому, если вы хотите использовать это для нескольких запросов, вам нужно сделать параметры способными получать ваши аргументы. Вы можете сделать это довольно просто, как словарь:

def _sql_to_data(sql, values):
    ...
    conn.execute(sql, values)

values будет словарь.Затем вы можете использовать свою функцию следующим образом...

sql = 'SELECT ...'
data = { 'user_id' : 3 }
results = _sql_to_data(sql, data)

использование ключевых слов в качестве параметров-это всего лишь один из способов указания аргументов в