【问题标题】:Python MySQL INSERT from csv来自csv的Python MySQL INSERT
【发布时间】:2012-06-24 18:25:49
【问题描述】:

我正在编写一个脚本来解析 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 批量导入的原因。)

提前感谢您的帮助!

【问题讨论】:

    标签: python mysql insert


    【解决方案1】:

    使用:

    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)
    

    【讨论】:

    • 啊!谢谢,有道理!
    • 一段很棒的代码!为什么我得到“在字符串格式化期间并非所有参数都转换”? :(
    【解决方案2】:

    你这样做的方式,row[n]s 不引用变量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阅读更多内容。

    【讨论】:

    • 感谢您的解释,现在说得通了! (而且我实际上是编程的血腥初学者,python 是我的第一语言。没有任何 PHP 背景,只是我的大脑在期待不会发生的事情。)
    • 好的。然后你就有了一个用 PHP 编程的大脑 :) 很高兴它有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-02
    • 2019-08-08
    • 1970-01-01
    相关资源
    最近更新 更多