DataFrame插入MySQL:处理重复主键与自动添加插入时间戳
解决方案
一、插入非重复行并针对重复行报错
默认to_sql的批量插入逻辑会因单条重复数据导致整个批次失败,要实现非重复行正常插入、重复行单独报错,可按以下步骤操作:
查询数据库已存在的主键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()拆分待插入数据
将DataFrame拆分为「无重复的新数据」和「重复数据」两个部分:# 筛选非重复行 df_new = df[~df['ID'].isin(existing_ids)] # 筛选重复行 df_duplicates = df[df['ID'].isin(existing_ids)]插入非重复行并抛出重复错误
优先插入无重复的数据,若存在重复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列,即可自动记录数据插入时间:
- 执行SQL修改表结构
直接在MySQL中运行以下语句(或通过Python的SQLAlchemy执行):
该列会在每次插入新行时,自动填充当前系统时间,无需在Python代码中手动传入时间值。ALTER TABLE StudentTable ADD COLUMN CreatedAt TIMESTAMP DEFAULT CURRENT_TIMESTAMP;
内容的提问来源于stack exchange,提问作者Aks3
相关产品推荐
相关产品推荐

