在SQLAlchemy的connection.execute中有效传递参数
在SQLAlchemy中,connection.execute()方法允许用户执行SQL语句并检索有效地取得结果。但是,在向 SQL 语句传递参数时,安全有效地执行此操作非常重要。
理解问题
正如您所提到的,您目前正在使用 SQL 格式化将参数传递给 SQL 字符串,这涉及在 SQL 语句上使用 format() 方法。虽然此方法可能很方便,但它不是最佳实践,并且可能导致 SQL 注入漏洞。相反,SQLAlchemy 提供了多种机制来安全有效地将参数传递给 SQL 语句。
使用文本 SQL 的解决方案
一种推荐的方法是使用 SQLAlchemy.sql.text () 函数创建文本 SQL 语句对象。该对象提供对绑定参数的支持,可以帮助防止 SQL 注入攻击。下面是一个示例:
from sqlalchemy.sql import text sql = text("SELECT * FROM users WHERE name = :name")
然后,您可以对生成的文本 SQL 对象使用execute() 方法,并使用关键字参数指定参数值:
connection.execute(sql, {"name": "John"})
解决方案使用参数化函数
另一种方法是使用以下方法创建参数化函数sqlalchemy.sql.expression.bindparam() 函数。此函数允许您为稍后传入的参数值创建占位符:
from sqlalchemy.sql.expression import bindparam params = [ bindparam("name", type_=String), bindparam("age", type_=Integer) ] sql = sqlalchemy.text("SELECT * FROM users WHERE name = :name AND age = :age") connection.execute(sql, {"name": "John", "age": 30})
将参数传递给您的自定义函数
调整您的 __sql_to_data()函数接受参数,你可以使用字典来存储参数值:
def __sql_to_data(sql, params): connection = engine.connect() try: rows = connection.execute(sql, params) # ... (Remaining code) finally: connection.close()
然后你可以使用参数值字典调用此函数,例如:
data = {"user_id": 3} __sql_to_data(sql_get_profile, data)
结论
通过使用推荐的方法,您可以安全有效地将参数传递给 SQL SQLAlchemy 中的语句,增强数据库应用程序的安全性和可维护性。
以上是如何在SQLAlchemy的`connection.execute()`中安全有效地传递参数?的详细内容。更多信息请关注PHP中文网其他相关文章!