使用Pandas在MariaDB多对多关系表中批量插入数据遇阻
多对多关系CSV批量插入MariaDB解决方案
核心流程
要解决这个问题,关键是拆分操作步骤,分别处理分类表、产品表和中间关联表,同时确保读取所有CSV字段但按需传入不同INSERT语句:
- 先读取完整CSV数据(必须包含所有字段,避免AttributeError)
- 去重插入分类表
- 插入产品表并获取产品ID
- 根据产品ID和分类ID插入中间关联表
具体实现步骤(以Python+pymysql为例)
读取完整CSV数据
确保读取所有字段,包括产品字段和分类字段,示例:import pandas as pd import pymysql # 数据库连接 conn = pymysql.connect(host='localhost', user='你的用户名', password='你的密码', db='你的数据库名') cursor = conn.cursor() # 读取CSV,包含所有需要的字段 df = pd.read_csv('你的数据文件.csv')去重插入分类表
提取CSV中的分类值,去重后插入CATEGORIE表,用INSERT IGNORE避免重复插入报错:# 遍历所有唯一分类,插入分类表 for categoria in df['categorie'].unique(): cursor.execute("INSERT IGNORE INTO CATEGORIE (nome) VALUES (%s)", (categoria,)) conn.commit()插入产品表并关联分类
遍历每一行数据,先插入产品表(只传产品相关字段,避免无用字段报错),再获取产品ID,查询对应分类ID,最后插入中间表:for _, row in df.iterrows(): # 插入产品表,仅传入产品表需要的字段(比如nome、prezzo) cursor.execute("INSERT INTO PRODOTTI (nome, prezzo) VALUES (%s, %s)", (row['nome'], row['prezzo'])) # 获取刚插入的产品ID prodotto_id = cursor.lastrowid # 查询当前分类的ID cursor.execute("SELECT id FROM CATEGORIE WHERE nome = %s", (row['categorie'],)) categorie_id = cursor.fetchone()[0] # 插入中间关联表 cursor.execute("INSERT INTO PRODOTTI_has_CATEGORIE (PRODOTTI_id, CATEGORIE_id) VALUES (%s, %s)", (prodotto_id, categorie_id)) conn.commit() cursor.close() conn.close()
关键注意事项
- 必须读取所有CSV字段:如果跳过
categorie字段,代码中调用row['categorie']会触发AttributeError,所以必须完整读取 - 按需传入INSERT参数:插入产品表时只传产品表的字段,不要把
categorie传入,这样就不会出现"字段未在INSERT中使用"的报错 - 分类去重:用
INSERT IGNORE或ON DUPLICATE KEY UPDATE(需给分类表的nome字段加唯一键)避免重复插入分类 - 事务保障:如果数据量较大,建议把操作放在事务中,出错时回滚,保证数据一致性
内容的提问来源于stack exchange,提问作者TitusI
相关产品推荐
相关产品推荐

