【问题标题】:Inserting csv into MySQL database with python library mysql.connector使用 python 库 mysql.connector 将 csv 插入 MySQL 数据库
【发布时间】: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")

【问题讨论】:

    标签: python mysql csv


    【解决方案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() 方法
    猜你喜欢
    • 1970-01-01
    • 2021-07-08
    • 1970-01-01
    • 2022-11-29
    • 2021-03-15
    • 1970-01-01
    • 1970-01-01
    • 2013-02-19
    • 2021-06-26
    相关资源
    最近更新 更多