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

Den*_*nis 23 python sql sqlalchemy parameter-passing

我正在使用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
Run Code Online (Sandbox Code Playgroud)

例如

__sql_to_data(sql_get_scan_candidate)
Run Code Online (Sandbox Code Playgroud)给我很好的数据结构(当然我用它来处理小数据集).但是为了向sql添加参数,我目前正在使用格式,例如

return __sql_to_data(sql_get_profile.format(user_id))
Run Code Online (Sandbox Code Playgroud)

问题 如何修改程序以使类似的东西成为可能

return __sql_to_data(sql_get_profile,user_id)
Run Code Online (Sandbox Code Playgroud)

Mar*_*eth 54

本教程为此提供了一个非常好的示例:

>>> 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',)]
Run Code Online (Sandbox Code Playgroud)

首先,获取SQL字符串并将其传递给sqalchemy.sql.text().这不是必要的,但可能是一个好主意......

text()在普通字符串上提供的优点是对绑定参数的后端中立支持,每个语句执行选项,以及绑定参数和结果列类型行为,允许SQLAlchemy类型构造在执行语句时发挥作用按字面指定.

请注意,即使您没有使用text(),也不应该只使用sql.format(...).这会导致SQL注入攻击的风险增加.

接下来,您可以使用关键字参数为您已经使用的execute()函数指定实际参数.

现在,在您的示例中,您有一个包装执行功能的函数.因此,如果要将其用于多个查询,则需要使参数能够接收您的参数.你可以像字典一样简单地做到这一点:

def _sql_to_data(sql, values):
    ...
    conn.execute(sql, values)
Run Code Online (Sandbox Code Playgroud)

values 将是一本字典.然后你可以像这样使用你的函数......

sql = 'SELECT ...'
data = { 'user_id' : 3 }
results = _sql_to_data(sql, data)
Run Code Online (Sandbox Code Playgroud)

使用关键字作为参数只是指定execute()函数参数的一种方法.您可以通过几种不同的方式阅读功能的文档.

  • 在 2.0 风格中,值必须作为字典(或字典列表)传递;不再接受单独的关键字参数。 (5认同)
  • 谢谢,我的不好,由于某种原因,我无法在doc中找到它.我唯一的借口SQLAlchemy doc有点支离破碎,强调ORM. (3认同)

Tan*_*lam 13

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

stmt = text("SELECT * FROM attendance WHERE user_id = :x")
stmt = stmt.bindparams(x="1")
res = session.execute(stmt).all()
Run Code Online (Sandbox Code Playgroud)