我使用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)
答案 0 :(得分:44)
The tutorial为此提供了一个很好的例子:
>>> 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()提供的优点是普通字符串是后端中立的 支持绑定参数,每个语句执行选项 作为绑定参数和结果列键入行为,允许 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()
函数参数的一种方法。您可以通过几种不同的方式阅读the documentation该功能。