假设我有以下file.csv
DATE Name Email
26-Sep-19 Name1 [email protected]
26-Sep-19 Name2 [email protected]
26-Sep-19 Name3 [email protected]
我正在尝试将file.csv中的值插入表中
import cx_Oracle
import csv
import os
from datetime import datetime
con = cx_Oracle.connect(uname, pwd, hostname + ': ' + port + '/' + service)
cursor = con.cursor()
with open('file.csv', 'r') as csv_file:
csv_reader = csv.reader(csv_file, delimiter=',')
for lines in csv_reader:
cursor.execute( "INSERT INTO table1 ( DATE,Name,Email) values (:1, :2, :3)",
(lines[0],lines[1],lines[2])
cursor.close()
con.commit()
con.close()
我收到此错误:
(lines [0],lines [1],lines [2])cx_Oracle.DatabaseError:ORA-01858:a在需要数字的地方找到了非数字字符
经过一些调试后,我能够将其归因于日期问题,因此,我代替了行[0],而是用硬编码的日期代替了,并且有效!
cursor.execute( "INSERT INTO table1 ( DATE,Name,Email) values (:1, :2, :3)",
('26-Sep-19',lines[1],lines[2])
为什么它不与lines[0]
变量一起使用,但具有硬编码的值却可以正常工作?
您的日期的字符串格式必须与Oracle期望的匹配。您可以为会话设置NLS_DATE_FORMAT
参数,也可以直接修改代码以执行类似以下操作:
cursor.execute("""
insert into table1 (date, name, email)
values (to_date(:1, 'dd-Mon-YY'), :2, :3)""",
(lines[0], lines[1], lines[2]))