You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Pandas在MariaDB多对多关系表中批量插入数据遇阻

多对多关系CSV批量插入MariaDB解决方案

核心流程

要解决这个问题,关键是拆分操作步骤,分别处理分类表、产品表和中间关联表,同时确保读取所有CSV字段但按需传入不同INSERT语句:

  • 先读取完整CSV数据(必须包含所有字段,避免AttributeError)
  • 去重插入分类表
  • 插入产品表并获取产品ID
  • 根据产品ID和分类ID插入中间关联表

具体实现步骤(以Python+pymysql为例)

  1. 读取完整CSV数据
    确保读取所有字段,包括产品字段和分类字段,示例:

    import pandas as pd
    import pymysql
    
    # 数据库连接
    conn = pymysql.connect(host='localhost', user='你的用户名', password='你的密码', db='你的数据库名')
    cursor = conn.cursor()
    
    # 读取CSV,包含所有需要的字段
    df = pd.read_csv('你的数据文件.csv')
    
  2. 去重插入分类表
    提取CSV中的分类值,去重后插入CATEGORIE表,用INSERT IGNORE避免重复插入报错:

    # 遍历所有唯一分类,插入分类表
    for categoria in df['categorie'].unique():
        cursor.execute("INSERT IGNORE INTO CATEGORIE (nome) VALUES (%s)", (categoria,))
    conn.commit()
    
  3. 插入产品表并关联分类
    遍历每一行数据,先插入产品表(只传产品相关字段,避免无用字段报错),再获取产品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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 14:47:34