使用 python 库 mysql.connector 将 csv 插入 MySQL 数据库

Posted

技术标签:

【中文标题】使用 python 库 mysql.connector 将 csv 插入 MySQL 数据库【英文标题】:Inserting csv into MySQL database with python library mysql.connector 【发布时间】:2020-04-01 10:28:33 【问题描述】:

我无法使用 mysql.connector 将 csv 数据插入 MySQL 表。

我使用的代码如下所示:

import mysql.connector
import csv

andreport = 'testowa.csv'
cnx = mysql.connector.connect(
    user='xxxxx',
    password='xxxxx',
    host='xxxxxx',
    database='xxxxx')

cursor = cnx.cursor()

with open(andreport, 'r') as csv_data:
    for row in csv_data:
        cursor.execute(
            "INSERT INTO flex(date, Store, Vendor, Shelf)"
            "VALUES(,,,)", row)
cnx.commit()
cursor.close()
cnx.close()
print("Done")

我得到的错误:

C:\Users\Iw4n\PycharmProjects\Learning\venv\Scripts\python.exe C:/Users/Iw4n/PycharmProjects/Learning/Orange_android_MySQL_insertion.py
Traceback (most recent call last):
  File "C:/Users/Iw4n/PycharmProjects/Learning/Orange_android_MySQL_insertion.py", line 15, in <module>
    cursor.execute(
  File "C:\Users\Iw4n\PycharmProjects\Learning\venv\lib\site-packages\mysql\connector\cursor.py", line 551, in execute
    self._handle_result(self._connection.cmd_query(stmt))
  File "C:\Users\Iw4n\PycharmProjects\Learning\venv\lib\site-packages\mysql\connector\connection.py", line 490, in cmd_query
    result = self._handle_result(self._send_cmd(ServerCmd.QUERY, query))
  File "C:\Users\Iw4n\PycharmProjects\Learning\venv\lib\site-packages\mysql\connector\connection.py", line 395, in _handle_result
    raise errors.get_exception(packet)
mysql.connector.errors.ProgrammingError: 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ',,,)' at line 1

当我将 包装到 '' 中时,与 csv 中一样多的行被插入到数据库中作为 ,

如果我使用 %s 也是一样的情况,我得到与上面相同的错误,当它被包裹在 '' 中时,%s 被插入到数据库中。 我还找到了在“INSERT~”前面添加 f 的信息,但它没有帮助。

谁能给我一些关于如何克服这个问题并将数据正确插入 MySQL 的建议?

按预期工作的最终代码:

import mysql.connector
import csv

andreport = 'testowa.csv'
cnx = mysql.connector.connect(
    user='xxxxx',
    password='xxxxx',
    host='xxxxx',
    database='xxxxx')

cursor = cnx.cursor()

with open(andreport, mode='r') as csv_data:
    reader = csv.reader(csv_data, delimiter=';')
    csv_data_list = list(reader)
    for row in csv_data_list:
        cursor.execute("""
                   INSERT INTO flex(
                   date, Agency, MediaSource, Campaign)
                   VALUES(%s,%s,%s,%s)""",
                    (row[0], row[1], row[2], row[3]))
cnx.commit()
cursor.close()
cnx.close()
print("Done")

【问题讨论】:

【参考方案1】:

我猜问题似乎在于您传递了一个参数(row) 而不是四个。所以试试这个:

  cursor.execute("""
            INSERT INTO flex(date, Store, Vendor, Shelf)
            VALUES(%s,%s,%s,%s)""",(row[0], row[1], row[2], row[3], ))

【讨论】:

现在它抛出另一个错误:cnx.commit() SyntaxError: invalid syntax。当我注释掉它时,它会为 cursor.close() 抛出相同的 syntaxError ,然后如果这个也被注释掉, cnx.close() 会得到错误 我错过了关闭括号:/ 立即尝试 cursor.execute(""" TypeError: 字符串格式化期间并非所有参数都转换 好吧,我们快到了。它进行了进一步处理,但日期格式为 YYYY-MM-DD 并且拆分如下:日期得到值 2,商店得到值 0,供应商得到值 1,自我得到值 9。知道为什么会这样吗? 字段以“;”结尾【参考方案2】:

查看MySQLCursor.excute() 方法的文档,似乎添加了一些%s 作为插入语句中的参数可能会解决此问题?

import mysql.connector
import csv

andreport = 'testowa.csv'
cnx = mysql.connector.connect(
    user='xxxxx',
    password='xxxxx',
    host='xxxxxx',
    database='xxxxx')

cursor = cnx.cursor()

insert_statement = (
    "INSERT INTO flex(date, Store, Vendor, Shelf)"
    "VALUES (%s, %s, %s, %s)"
)

with open(andreport, mode='r') as csv_data:
    reader = csv.reader(csv_data, delimiter=';')
    csv_data_list = list(reader)
    for row in csv_data_list:
        cursor.execute(insert_statement, row)
cnx.commit()
cursor.close()
cnx.close()
print("Done")

让我知道这是否能让您有所收获,或者您是否看到新错误!

编辑:更新 CSV 读数以转换为列表。

【讨论】:

我已经尝试了 %s 的解决方案,但它导致了同样的错误。以下是详细信息 mysql.connector.errors.ProgrammingError: 1064 (42000): 你的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的 '%s, %s, %s, %s)' 附近使用正确的语法 啊哈!所以我认为你需要添加%ss 和调整从 CSV 读取数据的方式——更新我的答案! 下面是 Mahrez BenHamad 建议的解决方案,我们快到了。现在由于未知原因,csv 被插入但不正确。字段以“;”结尾但第一个字段是形状“YYYY-MM-DD”的日期,但它被插入为列日期获取 2,列 Store 0,Vendor 1 和 Shelf 9" 是的,所以它似乎将row 视为一个字符串,因此如果字符串类似于'2019 . . .',那么row[0] 将是'2'row[1] 将是'0' 我认为这里的主要问题是您如何将数据传递给 execute() 方法

以上是关于使用 python 库 mysql.connector 将 csv 插入 MySQL 数据库的主要内容,如果未能解决你的问题,请参考以下文章

在 Django 1.11 中使用 MySQL 连接器/Python 时出错

如何用python查询mysql乱码问题?

在 PHP 中,啥对应于 MySQLi 中的 mysql.connect_timeout?

ImportError:没有名为 _mysql 的模块

python中检测mysql的主键唯一性异常

MySQL-mysql_real_connect()函数介绍