尝试根据报告的生产日期将SQL Server数据库表动态加载到Python pandas DataFrame中。我写的时候是以下问题:
import pyodbc
conn = pyodbc.connect(server = "10.87.254.73", Database= "CTData", Driver ="{SQL Server}")
PCBondsDB = pd.read_sql_query("Select * From [MarketData].[pcbond].[PCbonds] where ClosingDate = '2020-04-13'", conn)
conn.close()
它可以工作,我可以连接到数据库并提取表,但是如果我将where ClosingDate =更改为包含日期作为字符串的变量,它将无法工作。
假设DateProd ='2020-04-13',现在我尝试:
PCBondsDB = pd.read_sql_query("Select * From [MarketData].[pcbond].[PCbonds] where ClosingDate =
'DateProd'",
[抛出一个错误,我说:在SQL'Select * from [MarketData]。[pcbond]。[PCbonds]上执行失败,其中ClosingDate ='DateProd':('22007','[22007] [Microsoft] [ODBC [SQL Server驱动程序] [SQL Server]从字符串转换日期和/或时间时转换失败。(241)(SQLExecDirectW)')
对于为什么当我将它作为ClosingDate ='2020-04-13'的乱抛垃圾传递时,它是完全没有意义的,但是当我尝试使用ClosingDate ='DateProd'(包含完全相同的变量)时,值和数据类型为字符串)将无法正常工作并引发错误。
我尝试加倍,三倍引号,将单引号和双引号反转,似乎没有任何作用。我在论坛上四处张望,找不到这个特定问题的答案。我认为该解决方案很容易,但是我是Python的新手,我想知道..我正在尝试使它动态化,所以是的,我需要使用一个变量...
谢谢
您正在将字符串文字'DateProd'
作为日期传递。您需要将变量的value作为参数传递,如下所示:
date_prod = '2020-04-13'
sql = "Select * From [MarketData].[pcbond].[PCbonds] where ClosingDate = ?"
param_values = (date_prod, )
pc_bonds_db = pd.read_sql_query(sql, engine, params=param_values)