使用 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)' 附近使用正确的语法 啊哈!所以我认为你需要添加%s
s 和调整从 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 时出错