Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在pandas中使用sqlalchemy执行具有多个日期参数的sql存储过程_Python_Python 3.x_Pandas_Sqlalchemy_Pymssql - Fatal编程技术网

Python 如何在pandas中使用sqlalchemy执行具有多个日期参数的sql存储过程

Python 如何在pandas中使用sqlalchemy执行具有多个日期参数的sql存储过程,python,python-3.x,pandas,sqlalchemy,pymssql,Python,Python 3.x,Pandas,Sqlalchemy,Pymssql,我能够执行不带参数的存储过程: import pandas as pd import sqlalchemy import pyodbc import datetime as dt engine = sqlalchemy.create_engine('mssql+pymssql://MyServer/MyDB') df = pd.read_sql_query('EXEC dbo.TestProcedure' , engine) # stored procedure without para

我能够执行不带参数的存储过程:

import pandas as pd
import sqlalchemy
import pyodbc
import datetime as dt  

engine = sqlalchemy.create_engine('mssql+pymssql://MyServer/MyDB')
df = pd.read_sql_query('EXEC dbo.TestProcedure' , engine)  # stored procedure without parameters
print(df)
import pandas as pd
import sqlalchemy
import pyodbc
import datetime as dt  

myparams = ['2017-02-01','2017-02-28', None]  # None substitutes NULL in sql

engine = sqlalchemy.create_engine('mssql+pymssql://MyServer/MyDB')
df = pd.read_sql_query('EXEC PythonTest_Align_RSrptAccountCurrentMunich @EffectiveDateFrom=?,@EffectiveDateTo=?,@ProducerLocationID=?', engine, params=myparams)
print(df)
  File "src\pymssql.pyx", line 465, in pymssql.Cursor.execute
sqlalchemy.exc.ProgrammingError: (pymssql.ProgrammingError) (102, b"Incorrect syntax near '?'.DB-Lib error message 20018, severity 15:\nGeneral SQL Server error: Check messages from the SQL Server\n")
[SQL: EXEC PythonTest_Align_RSrptAccountCurrentMunich @EffectiveDateFrom=?,@EffectiveDateTo=?,@ProducerLocationID=?]
[parameters: ('2017-02-01', '2017-02-28', None)]
(Background on this error at: http://sqlalche.me/e/f405)
但无法使用参数执行存储过程:

import pandas as pd
import sqlalchemy
import pyodbc
import datetime as dt  

engine = sqlalchemy.create_engine('mssql+pymssql://MyServer/MyDB')
df = pd.read_sql_query('EXEC dbo.TestProcedure' , engine)  # stored procedure without parameters
print(df)
import pandas as pd
import sqlalchemy
import pyodbc
import datetime as dt  

myparams = ['2017-02-01','2017-02-28', None]  # None substitutes NULL in sql

engine = sqlalchemy.create_engine('mssql+pymssql://MyServer/MyDB')
df = pd.read_sql_query('EXEC PythonTest_Align_RSrptAccountCurrentMunich @EffectiveDateFrom=?,@EffectiveDateTo=?,@ProducerLocationID=?', engine, params=myparams)
print(df)
  File "src\pymssql.pyx", line 465, in pymssql.Cursor.execute
sqlalchemy.exc.ProgrammingError: (pymssql.ProgrammingError) (102, b"Incorrect syntax near '?'.DB-Lib error message 20018, severity 15:\nGeneral SQL Server error: Check messages from the SQL Server\n")
[SQL: EXEC PythonTest_Align_RSrptAccountCurrentMunich @EffectiveDateFrom=?,@EffectiveDateTo=?,@ProducerLocationID=?]
[parameters: ('2017-02-01', '2017-02-28', None)]
(Background on this error at: http://sqlalche.me/e/f405)
错误消息:

import pandas as pd
import sqlalchemy
import pyodbc
import datetime as dt  

engine = sqlalchemy.create_engine('mssql+pymssql://MyServer/MyDB')
df = pd.read_sql_query('EXEC dbo.TestProcedure' , engine)  # stored procedure without parameters
print(df)
import pandas as pd
import sqlalchemy
import pyodbc
import datetime as dt  

myparams = ['2017-02-01','2017-02-28', None]  # None substitutes NULL in sql

engine = sqlalchemy.create_engine('mssql+pymssql://MyServer/MyDB')
df = pd.read_sql_query('EXEC PythonTest_Align_RSrptAccountCurrentMunich @EffectiveDateFrom=?,@EffectiveDateTo=?,@ProducerLocationID=?', engine, params=myparams)
print(df)
  File "src\pymssql.pyx", line 465, in pymssql.Cursor.execute
sqlalchemy.exc.ProgrammingError: (pymssql.ProgrammingError) (102, b"Incorrect syntax near '?'.DB-Lib error message 20018, severity 15:\nGeneral SQL Server error: Check messages from the SQL Server\n")
[SQL: EXEC PythonTest_Align_RSrptAccountCurrentMunich @EffectiveDateFrom=?,@EffectiveDateTo=?,@ProducerLocationID=?]
[parameters: ('2017-02-01', '2017-02-28', None)]
(Background on this error at: http://sqlalche.me/e/f405)

如何使用
sqlalchemy
传递参数?

Read\u sql仅用于读取表。要使用参数执行某些操作,请尝试使用

engine.execute(您的sql查询)#您可以尝试输入参数,以了解如何给出 在sql中
engine.execution\u options(autocommit=True)

如果执行带有参数占位符的原始SQL查询,则必须使用DBAPI层支持的。pymssql使用的是“格式”参数样式
%s
,而不是“qmark”参数样式
(pyodbc使用的)

但是,可以通过将查询包装在SQLAlchemy
text
对象中并一致使用“named”参数样式来避免歧义。SQLAlchemy将自动将参数占位符转换为您正在使用的DBAPI的适当样式。例如,要调用名为
echo\u datetimes
的存储过程:

导入日期时间
将sqlalchemy作为sa导入
# ...
query=sa.text(“EXEC echo\u datetimes@p1=:param1,@p2=:param2”)
值={'param1':datetime.datetime(2020,1,1,1,1,1),
“param2”:datetime.datetime(2020,2,2,2,2,2)}
df=pd.read\u sql\u查询(查询、引擎、参数=值)
打印(df)
#dt_开始dt_结束
# 0 2020-01-01 01:01:01 2020-02-02 02:02:02