python - 使用不同的参数集在 Python 中执行具有多个参数的存储过程
问题描述
我需要从 Python 执行一个具有 2 个日期参数的存储过程。我想使用数据帧行中的参数集在循环中多次更改参数和执行过程。我的代码如下;
def _get_dataset(date_param1, data_param2):
sql="exec [dbo].[SP_Name] (%s,%s)" % (date_param1,
date_param2)
cnxn = pyodbc.connect('DRIVER={SQL
Server};SERVER=xxx.xxx.xx.xx;DATABASE=db;UID=userid;PWD=password')
cursor = cnxn.cursor()
data = pd.read_sql(sql,cnxn)
return data
for i in range(len(dataframe)):
first_date = df.iloc[i][0]
second_date = df.iloc[i][1]
_get_dataset(str(first), str(second))
我得到的错误;
DatabaseError: Execution failed on sql 'exec [dbo].[SP_name] (2019-06-25,2019-06-24)': ('42000', "[42000] [Microsoft][ODBC SQL Server Driver][SQL Server]Incorrect syntax near '2019'. (102) (SQLExecDirectW)")
代码有什么问题?提前致谢。
解决方案
我没有用于测试的 SQL Server,但最好使用传递参数read_sql
,因为它将使用底层数据库驱动程序以安全的方式执行字符串插值:
def _get_dataset(date_param1, data_param2):
sql = "exec [dbo].[SP_Name] (?, ?)"
cnxn = pyodbc.connect(
'DRIVER={SQL Server};SERVER=xxx.xxx.xx.xx;DATABASE=db;UID=userid;PWD=password'
)
cursor = cnxn.cursor()
data = pd.read_sql(sql, cnxn, params=(date_param1, data_param2))
return data
您还可以使用 SQLAlchemy 之类的 ORM 以与驱动程序无关的方式传递参数,因此您的代码不依赖于特定的驱动程序语法:
In [559]: import sqlalchemy as sa
In [560]: pd.read_sql(sa.text('SELECT * FROM data where Col_1=:col1'),
.....: engine, params={'col1': 'X'})
.....:
Out[560]:
index id Date Col_1 Col_2 Col_3
0 0 26 2010-10-18 00:00:00.000000 X 27.5 1
推荐阅读
- javascript - 使用 express 在 cookie 中发送数组不起作用
- javascript - vue js 切换函数,基于三元函数
- c - 输出与输入 c 不同
- ipu - PopVision 系统分析器和图形分析器是开源的吗?
- haskell - 如何在服务应用程序中访问原始请求正文
- flutter - 向下滚动 ListView 时,ListView 中的 Selected ChoiceChip 取消选择自身
- amazon-s3 - 在 AmazonS3.getObject(String, String) 中强制执行数据完整性检查
- facebook - Messenger bot 上不支持的获取请求(轮播、外部 url 按钮)
- wpf - WPF 控件模板不根据依赖属性绑定值更改
- java - io.grpc.StatusRuntimeException:未实现:未知服务 manipula.core2.core.proto.Centrifugo