我有以下代码段,我在其中读取 csv 文件并连接到数据库。然后我想将 CSV 文件中的两列作为变量传递给我的查询,并最终将结果转换为 pd 数据库。
我尝试了不同的绑定和转换列到列表的方法,但没有成功。通过这段代码我得到以下内容 错误:
DatabaseError: DPY-4010: a bind variable replacement value
for placeholder ":HOUR" was not provided
或者当我将此部分添加到execute()时出现以下错误:
res = connection.cursor().execute("SELECT HOUR,UNITSCHEDULEID,VERSIONID,MINRUNTIME FROM
int_Stg.UnitScheduleOfferHourly WHERE Hour in :1 AND UnitScheduleId in :2", hour, unitid)
TypeError: Cursor.execute() takes from 2 to 3 positional arguments but 4 were given
以下是我执行的代码:
import pandas as pd
import numpy as np
df = pd.read_csv(r"csv.csv")
df=df.dropna()
unitid=df['UNITSCHEDULEID'].unique()
hour=df['GMT_DATETIME'].unique()
import os, oracledb, csv, pyodbc
TNS_Admin = os.environ.get('TNS_Admin', r'\\corp.xxx\oracle')
oracledb.defaults.config_dir = TNS_Admin
pw = input(f'Enter password: ')
connection = oracledb.connect(user='xxxxx', password= pw, dsn="World")
res = connection.cursor().execute("SELECT HOUR,UNITSCHEDULEID,VERSIONID,MINRUNTIME FROM
int_Stg.UnitScheduleOfferHourly WHERE Hour in :Hour AND UnitScheduleId in :unitid").fetchall()
print(res)
connection.close()
为数组中的每个值生成一个带有绑定变量的语句,然后将这些值传递给绑定变量:
query = """SELECT HOUR, UNITSCHEDULEID, VERSIONID, MINRUNTIME
FROM int_Stg.UnitScheduleOfferHourly
WHERE Hour in ({hour_binds})
AND UnitScheduleId in ({id_binds})""".format(
hour_binds=",".join((f":{idx}" for idx, _ in enumerate(hours, 1))),
id_binds=",".join((f":{idx}" for idx, _ in enumerate(unitid, len(hours) + 1))),
)
res = connection.cursor().execute(query, (*hours, *unitid)).fetchall()
print(res)