繁体   English   中英

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

[英]Entering data in oracle 11g from semicolon separated text file using python

嗨,我正在尝试使用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和float,还有什么更好的方法。

尝试以下

   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标记),然后为参数提供一个元组值。

正如卢克·伍德沃德(Luke Woodward)在回答中指出的那样,列名不应用单引号引起来。 但是,应使用绑定变量,而不是如下所示的%s标记:

data = record_split[:3]
cur.execute("insert into Demographic (A1, A2, A3) values (:1, :2, :3)",
    data)

这是为了避免必须处理特殊字符(例如嵌入式引号),并避免诸如SQL注入之类的安全性问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM