我正在使用 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)
教程为此提供了一个很好的例子:
>>> 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()
函数参数的一种方法。您可以通过几种不同的方式阅读该函数的文档。
这是绑定会话执行参数的最新方法
stmt = text("SELECT * FROM attendance WHERE user_id = :x")
stmt = stmt.bindparams(x="1")
res = session.execute(stmt).all()