Python、SQLAlchemy在connection.execute中传递参数

问题描述 投票:0回答:2

我正在使用 SQLAlchemy connection.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)
python sql sqlalchemy parameter-passing
2个回答
121
投票

教程为此提供了一个很好的例子:

>>> 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注入攻击风险。

接下来,您可以使用关键字参数为您已经使用过的 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()
函数参数的一种方法。您可以通过几种不同的方式阅读该函数的文档


13
投票

这是绑定会话执行参数的最新方法

stmt = text("SELECT * FROM attendance WHERE user_id = :x")
stmt = stmt.bindparams(x="1")
res = session.execute(stmt).all()
© www.soinside.com 2019 - 2024. All rights reserved.