【问题标题】:How correctly execute a MSSQL stored procedure with parameters in Python如何在 Python 中正确执行带参数的 MSSQL 存储过程
【发布时间】:2021-03-18 21:44:18
【问题描述】:

目前我正在以这种方式执行存储过程:

engine = sqlalchemy.create_engine(self.getSql_conn_url())
query = "exec sp_getVariablesList @City = '{0}', @Station='{1}'".format(City, Station)
self.Variables = pd.read_sql_query(query, engine)

但在How set ARITHABORT ON at sqlalchemy 被正确地注意到这使得它对 SQL 注入开放。我尝试了不同的方法,但没有成功。那么应该如何将参数传递给MSSQL存储过程来消除SQL注入的风险呢?这可以使用 sqlalchemy 或任何其他方式。

【问题讨论】:

标签: python sql-server python-3.x sqlalchemy sql-injection


【解决方案1】:

使用“命名”参数样式编写您的 SQL 命令文本,将其包装在 SQLAlchemy text() 对象中,并将参数值作为字典传递:

import pandas as pd
import sqlalchemy as sa

connection_uri = "mssql+pyodbc://@mssqlLocal64"
engine = sa.create_engine(connection_uri)

# SQL command text using "named" paramstyle
sql = """
SET NOCOUNT ON;
SET ARITHABORT ON;
EXEC dbo.breakfast @name = :name_param, @food = :food_param;
"""
# parameter values
param_values = {"name_param": "Gord", "food_param": "bacon"}
# execute query wrapped in SQLAlchemy text() object
df = pd.read_sql_query(sa.text(sql), engine, params=param_values)

print(df)
"""
                           column1
0  Gord likes bacon for breakfast.
"""

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-24
    • 2015-07-11
    • 1970-01-01
    • 2017-11-02
    • 2011-08-27
    • 2014-03-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多