您好我正在尝试使用cx_Oracle(Python)输入以分号分隔的文本文件存储的数据。
conn = co.connect('system/ayush@127.0.0.1/xe')
cur = conn.cursor()
f = open("C:\\Users\\goyal\\district.txt","r")
for line in f:
record_split = line.split(";")
cur.execute("INSERT INTO Demographic('A1','A2','A3') VALUES
(record_split[0],record_split[1],record_split[2])")
conn.commit()
然而,它给了我以下错误
DatabaseError Traceback (most recent call last)
<ipython-input-16-4cbe704bce0e> in <module>()
4 for line in f:
5 record_split = line.split(";")
----> 6 cur.execute("INSERT INTO Demographics('A1','A2','A3')
VALUES(record_split[0],record_split[1],record_split[2]")
7 conn.commit()
DatabaseError: ORA-00928: missing SELECT keyword
为什么会出现此错误以及如何解决此问题?
修改
我找到了阅读csv的python教程并找到了这个方法
lines = csv.reader(open("district.txt","r"),delimiter=';')
next(lines,None)
for line in lines:
cur.execute("INSERT INTO Demographics(A1,A2,A3) VALUES(:1,:2,:3)",line)
conn.commit()
然而,这会将所有内容读作文本(偶数整数和浮点值)。因此,要在数据库中输入值,我必须明确地将值更改为int,并且浮点数有更好的方法。
答案 0 :(得分:0)
尝试以下
cur.execute("INSERT INTO Demographic(A1, A2, A3) VALUES (%s, %s, %s)",
(record_split[0],record_split[1],record_split[2]))
我的代码有两件事我看错:
A1
,A2
和A3
不应用单引号括起来('
),record_split
中的任何值。在字符串中使用参数(%s
标记),然后为参数提供元组值。答案 1 :(得分:0)
正如Luke Woodward在回答中所指出的,列名不应该用单引号括起来。但是,应使用绑定变量,而不是%s标记,如下所示:
data = record_split[:3]
cur.execute("insert into Demographic (A1, A2, A3) values (:1, :2, :3)",
data)
这是为了避免必须处理特殊字符(例如嵌入式引号)并避免SQL注入等安全问题。