使用 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
变量。
在使用 [=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
变量。