使用 cx_Oracle 中 csv 文件中的变量更新数据库

Update database using variable from csv file in cx_Oracle

在使用 [=28] 在 Oracle 数据库中执行更新命令时卡在出现错误 ORA-01036: 非法变量 name/number 的位置=] & Python3.6.8.

我想使用 CSV 文件 (db_results.csv) 中的变量值并执行更新命令。

db_results.csv 文件如下所示:

id, order_id, product, Courier, state
01, ORD987, Keyboard, DHL, TX
02, ORD976, Charger, Blue Dart, NY

我的代码:

con = cx_Oracle.connect("abc/abc@abc")
cur = con.cursor()

with open(r'D:\db_results.csv') as file:
    next(file)
    for line in file:
        x = line.replace('\n', ' ').replace('\r', '')
        columns = x.split(",")
        y = columns[1]
    SQL = "update inventory set model='301547' where order_id = '?'"
    cur.execute(SQL, y)
    con.commit()
con.close()

在 cx_Oracle 中是否有任何特定的 UPDATE 语法?试图为此找到示例,但 none 目前已找到。

  • ORA-01036 由于 oracle 的占位符类型错误而引发,更喜欢使用以冒号开头的整数,例如 :1 , :2

  • 不要忘记trim第二个占位符的值,以便获得 去掉 y

    值周围的空格
  • 不需要在 DML 中嵌入参数,而是将它们转换 到元组,例如 (301547, y)

    ...
    with open(r'D:\db_results.csv') as file:
        next(file)
        for line in file:
            x = line.replace('\n', ' ').replace('\r', '')
            columns = x.split(",")
            y = columns[1]
            SQL = "UPDATE inventory SET model=:1 WHERE order_id = TRIM(:2)"
            cur.execute(SQL, (301657, y))
        con.commit()
    con.close()
    

为每个 CSV 行调用一次 cur.execute()(如已接受的答案所示)会非常慢,因此不推荐。

改为使用 cur.executemany(),类似于 cx_Oracle 文档中的代码 Loading CSV Files into Oracle Database:

with open('testsp.csv', 'r') as csv_file:
    csv_reader = csv.reader(csv_file, delimiter=',')
    sql = "insert into test (id,name) values (:1, :2)"
    data = []
    for line in csv_reader:
        data.append((line[0], line[1]))
        if len(data) % batch_size == 0:
            cursor.executemany(sql, data)
            data = []
    if data:
        cursor.executemany(sql, data)
    con.commit()

在您的情况下,SQL 将是 UPDATE 语句,您只需要使用所需的值构造 data 变量。