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()函数参数的一种方法.您可以通过几种不同的方式阅读该功能的文档.
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)
| 归档时间: |
|
| 查看次数: |
38323 次 |
| 最近记录: |