2016-11-18 69 views
0

我是一名python初学者,我试图解析一个CSV文件并将其内容添加到数据库中。通过Python将CSV转化为SQL:传递多个参数

我当前的代码:

with open('fruit.csv', 'rb') as f: 
reader = csv.reader(f, delimiter='\t', quoting=csv.QUOTE_NONE) 
for row in reader: 
    sql = "INSERT INTO fruit(ID,NAME,COLOUR,SIZE) VALUES(?, ?, ?, ?)" 
    try: 
     cursor.execute(sql, [ row[0], row[1], row[2], row[3] ]) 
     db.commit() 
     print('done') 
    except csv.Error as e: 
     print('error: ' + e) 
     db.rollback() 

我现在的错误:

Traceback (most recent call last): 
    File "mysqltest.py", line 23, in <module> 
    cursor.execute(sql, (row[0], row[1], row[2], row[3])) 
    File "C:\Python27\lib\site-packages\MySQLdb\cursors.py", line 187, in execute 
    query = query % tuple([db.literal(item) for item in args]) 
TypeError: not all arguments converted during string formatting 

我在这里SE阅读答案很多其他的问题,但我仍然无法理解如何通过几个值在一行内作为一个SQL字符串的单独值。

不知道是否有关,但这是表的我想写的结构:

TABLE FRUIT (
     ID int primary key NOT NULL, 
      NAME CHAR(20) NOT NULL, 
      COLOUR CHAR(20), 
      SIZE CHAR(20)) 

如果有人能说明什么我做错了,这将会是非常赞赏!

+0

尝试在列表的末尾添加一个逗号。更多,请尝试与元组而不是列表的列表:) – 2016-11-18 19:20:16

+0

我的方式了解它,通过离开?我可以稍后在.execute()调用中传递参数,而当我尝试%s时(不成功),我还尝试按照您所说的传递参数。我只是试着按照你的建议添加.format,然后调整其余部分,但是我得到了一个ProgrammingError,并被告知要阅读我附近的语法(?,?,?,?)。 – Nicholas

+0

@ Dex'ter感谢您的回复。我认为这是你的意思? vals =(row [0],row [1],row [2],row [3])的数据类型为“sql =”插入水果(ID,NAME,COLOR,SIZE)VALUES(?,?,?,?) ]) cursor.execute(sql,vals)' – Nicholas

回答

1

在大多数的Python API模块,MySQL使用%s操作者而不是?

sql = "INSERT INTO fruit(ID, NAME, COLOUR, SIZE) VALUES(%s, %s, %s, %s)" 
try: 
    cursor.execute(sql, [row[0], row[1], row[2], row[3]]) 
+0

谢谢,我在其他问题中发现了这个语法,但我得到了这个结果: 'Traceback(最近调用最后一个): 文件“mysqltest.py”,第23行,在 cursor.execute(sql,[row文件“C:\ Python27 \ lib \ site-packages \ MySQLdb \ cursors.py”,第205行,执行 self.errorhandler [0],row [1],row [2],row [3]]) self.errorhandler (self,exc,value) 错误的整数值(1366,“错误的整数值:'ID'列'ID'在第1行“)' – Nicholas

+0

现在我明白了,我认为这是因为第一行实际上是标题,所以它应该被解析diff erently。如果我忽略它,我会看看它是否有效。 – Nicholas

+1

如果第一行是标题,在'with(...)'语句之后加'next(f)'以跳过它。另外,尝试转换为'int()'。 – Parfait

0

我认为类型错误。因此,你可以尝试下面的代码。

使用STR()函数

cursor.execute(sql, [ str(row[0]), str(row[1]), str(row[2]), str(row[3]) ]) 
+0

没有喜悦我害怕。因为它是数据库中的一个int,所以我还试图离开行[0]。我认为我的语法错了,但我不知道如何。 – Nicholas