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, [email protected]',)]
首先,把你的SQL字符串将它传递给sqalchemy.sql.text()。这是没有必要的,但可能是一个好主意......
优点文本()提供了一个简单的字符串是后端中立的绑定参数 支持,每个语句执行选项,以及 为绑定参数和结果列的键入行为,允许SQLAlchemy类型构造在执行字面指定的语句 时发挥作用。
请注意,即使您没有使用text(),也不应仅仅使用sql.format(...)。这会导致更大的攻击风险。
接下来,您可以使用关键字参数为您已经使用的execute()函数指定实际参数。
现在,在你的例子中,你有一个包装执行功能的函数。所以,如果你想用它来进行多个查询,你需要使参数能够接收你的参数。你可以这样做很简单的字典:
def _sql_to_data(sql, values):
...
conn.execute(sql, values)
values会那么dictionary.You可以用你的功能是这样的...
sql = 'SELECT ...'
data = { 'user_id' : 3 }
results = _sql_to_data(sql, data)
使用关键字为您的参数仅仅是一种方式指定函数的参数。您可以通过几种不同的方式阅读the documentation。