来自csv的Python MySQL INSERT

时间:2012-06-22 12:46:40

标签: python mysql insert

我正在编写一个脚本来解析csv文件并为MySQL表生成输入。

我通过csv.reader导入数据,因此每一行都是一个字符串列表。 我想迭代行并将不同的条目放入数据库。

我可以进行以下测试:

sql = "INSERT INTO `testSmall` (`idtestSmall`, `column1`, `column2`) VALUES (1, 'entry1', 'entry2');"
cursor.execute (sql)

所以我的SQL连接正常工作,原理SQL语法还可以。 我也可以访问我想要放入的条目,它们是正确的,并且是我期望的数据类型。 但是,我似乎无法在迭代中使用与变量相同的SQL语法:

allData = csv.reader(open('TestTable.csv', 'rb'), delimiter=',', quotechar='|')
for row in allData:
    sql = "INSERT INTO `testSmall` (`idtestSmall`, `column1`, `column2`) VALUES (row[0], row[1], row[2]);"
    cursor.execute (sql)

这会生成语法错误:

Error 1064: You have an error in your SQL syntax; check the manual that corresponds to our MySQL server version for the right syntax to use near '[0], row[1], row[2])' at line 1

但是数据类型是正确的,SQL语法与工作示例中的相同......

谁能告诉我我做错了什么以及如何让它发挥作用?

(最后,我不仅要插入纯csv条目,还要导出值,这就是为什么我不只是使用mysql批量导入。)

提前感谢您的帮助!

2 个答案:

答案 0 :(得分:3)

使用:

sql = "INSERT INTO `testSmall` (`idtestSmall`, `column1`, `column2`) VALUES (?, ?, ?);"
cursor.execute (sql, (row[0], row[1], row[2]))

问号是占位符。使用占位符的另一个好处是,它们可以通过转移qoutes等自动使您的输入“安全” 现在,您使用row[0], row[1], row[2]作为字符串,其中包含文本“row [0],row [1],row [2]”,而不是告诉python使用这些变量的值。


此外,如果要使用多个行的行,或者如果希望能够轻松更改输入列表的大小,则可以动态创建占位符:

sql = "INSERT INTO testSmall VALUES (%s);" % ', '.join('?' for _ in row)
cursor.execute (sql, row)

答案 1 :(得分:2)

你这样做的方式,row[n]不引用变量row,但它们只是发送到MySQL的一段字符串。 (我打赌你来自PHP背景,期望双引号用你的值替换你的变量)。

您可以这样做以在字符串(任何字符串)中插入值:

sql = "INSERT INTO `testSmall` (`idtestSmall`, `column1`, `column2`) VALUES (%s, %s, %s);" % row # will map each %s to the `n`th element in `row`

(这不起作用,请注意,因为如果row [0]是abc,那么该字符串将不会用引号括起来,因此MySQL不会将其解释为字符串)。尝试打印sql变量,然后将其复制/粘贴到mysql提示符中以查看它是否可行。

然而,当与MySQL一起使用时,你最好逃避这些,如下所示:

sql = "INSERT INTO `testSmall` (`idtestSmall`, `column1`, `column2`) VALUES (%s, %s, %s);"
    cursor.execute(sql, row)

您可以在the docs中阅读更多内容。