使用python从分号分隔的文本文件在oracle 11g中输入数据

时间:2018-03-28 19:27:55

标签: python oracle11g cx-oracle

您好我正在尝试使用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,并且浮点数有更好的方法。

2 个答案:

答案 0 :(得分:0)

尝试以下

   cur.execute("INSERT INTO Demographic(A1, A2, A3) VALUES (%s, %s, %s)",
     (record_split[0],record_split[1],record_split[2])) 

我的代码有两件事我看错:

  1. 列名A1A2A3不应用单引号括起来('),
  2. 您还不太清楚如何将参数值放入查询中:您的字符串未使用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注入等安全问题。