我试图通过使用PYODBCpython包的SQL合并语句从JSON文件传递值.以下是JSON文件的示例,其中包含2023年美元对162个国家/地区的汇率数据:
{"2023-01-01": {"USD": 1, "AED": 3.6725, "AFN": 88.74103815},
"2023-01-02": {"USD": 1, "AED": 3.6725, "AFN": 89.02144276}}
我使用以下代码将其解压缩为我的Python to SQL合并作业(job)所使用的格式(列表列表):
with open('ExchangeRates.json', 'r') as f:
data = json.load(f)
result = []
for date, conversion_rates in data.items():
for currency, rate in conversion_rates.items():
result.append(['USD', currency, rate, parser.parse(date)])
以下是结果样本:
[['USD', 'XOF', 593.76331894, '2023-12-30'], ['USD', 'XPF', 108.01769686, '2023-12-30'],
['USD', 'YER', 247.14186482, '2023-12-30'], ['USD', 'ZAR', 18.35621464, '2023-12-30'],
['USD', 'ZMW', 25.69324612, '2023-12-30'], ['USD', 'ZWL', 6047.08996546, '2023-12-30']]
我要传递给pyodbc cursor.execute()
的SQL和参数参数:
sql = """
MERGE INTO database.dbo.table_name AS Target
USING (
VALUES {}
) AS Source (currency_from, currency_to, factor, timestamp)
ON Target.currency_from = Source.currency_from
AND Target.currency_to = Source.currency_to
AND CAST(Target.timestamp as date) = CAST(Source.timestamp as date)
WHEN NOT MATCHED THEN
INSERT (currency_from, currency_to, factor, timestamp) VALUES (Source.currency_from, Source.currency_to, Source.factor, Source.timestamp);
""".format(','.join(['(?,?,?,?)' for _ in range(len(data))]))
params = [item for sublist in data for item in sublist]
cnxn = pyodbc.connect(conn_string)
crsr = cnxn.cursor()
try:
crsr.execute(sql, params)
except Exception as e:
crsr.rollback()
print(e)
print('Transaction rollback')
else:
cnxn.commit()
crsr.close()
cnxn.close()
这个代码在过go 是有效的,一切似乎都是正确的.我通过打印它们的输出分别判断了每个部分,我发现SQL代码字符串上的格式联接操作插入(?,?)58,968次(162个国家*364天),并且PARAMS变量将每个列值分离到一个由235,872个元素(58,968行*4列)组成的长列表中,这看起来都是正确的.我判断了我的工作查询,它们传递给cursor.execute(sql, params)
个相同的东西,只是数据要少得多.
我每天做的巨 Python 工作,连接到一个网站,让当天的美元对162个其他国家的汇率完美地工作.我能想到的唯一一件事是,我向pyodbc游标执行函数传递了太多数据.请帮我弄清楚为什么pyodbc/sql认为我提供了"-26272个参数标记",以及如何纠正我的编码错误.