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

DataFrame插入MySQL:处理重复主键与自动添加插入时间戳

解决方案

一、插入非重复行并针对重复行报错

默认to_sql的批量插入逻辑会因单条重复数据导致整个批次失败,要实现非重复行正常插入、重复行单独报错,可按以下步骤操作:

  1. 查询数据库已存在的主键ID
    先从StudentTable获取所有已有的ID,用于筛选待插入数据:

    import pandas as pd
    from sqlalchemy import create_engine
    
    engine = create_engine('mysql://user:pass@127.0.0.1/dbname')
    
    # 获取已存在的ID列表
    with engine.connect() as conn:
        existing_ids = pd.read_sql("SELECT ID FROM StudentTable", conn)['ID'].tolist()
    
  2. 拆分待插入数据
    将DataFrame拆分为「无重复的新数据」和「重复数据」两个部分:

    # 筛选非重复行
    df_new = df[~df['ID'].isin(existing_ids)]
    # 筛选重复行
    df_duplicates = df[df['ID'].isin(existing_ids)]
    
  3. 插入非重复行并抛出重复错误
    优先插入无重复的数据,若存在重复ID则抛出明确错误:

    # 插入非重复行
    if not df_new.empty:
        with engine.begin() as conn:
            df_new.to_sql(name='StudentTable', con=conn, if_exists='append', index=False)
    
    # 若有重复ID,抛出错误
    if not df_duplicates.empty:
        duplicate_ids = df_duplicates['ID'].tolist()
        raise ValueError(f"重复主键ID无法插入: {duplicate_ids}")
    

二、添加自动捕获插入时间的Timestamp列

通过修改MySQL表结构,添加默认值为当前时间的TIMESTAMP列,即可自动记录数据插入时间:

  1. 执行SQL修改表结构
    直接在MySQL中运行以下语句(或通过Python的SQLAlchemy执行):
    ALTER TABLE StudentTable ADD COLUMN CreatedAt TIMESTAMP DEFAULT CURRENT_TIMESTAMP;
    
    该列会在每次插入新行时,自动填充当前系统时间,无需在Python代码中手动传入时间值。

内容的提问来源于stack exchange,提问作者Aks3

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 00:31:38