AutoSkill pandas_dataframe_complex_upsert_sync
使用 Pandas 和 SQLAlchemy 将 DataFrame 同步到 MySQL,处理 Merge 后缀,并应用复杂的字段比较逻辑(JSON解析、数值归一化、条件排除、字符串排序)以实现精确的 Upsert。
install
source · Clone the upstream repo
git clone https://github.com/ECNU-ICALK/AutoSkill
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/ECNU-ICALK/AutoSkill "$T" && mkdir -p ~/.claude/skills && cp -r "$T/SkillBank/ConvSkill/chinese_gpt4_8/pandas_dataframe_complex_upsert_sync" ~/.claude/skills/ecnu-icalk-autoskill-pandas-dataframe-complex-upsert-sync && rm -rf "$T"
manifest:
SkillBank/ConvSkill/chinese_gpt4_8/pandas_dataframe_complex_upsert_sync/SKILL.mdsource content
pandas_dataframe_complex_upsert_sync
使用 Pandas 和 SQLAlchemy 将 DataFrame 同步到 MySQL,处理 Merge 后缀,并应用复杂的字段比较逻辑(JSON解析、数值归一化、条件排除、字符串排序)以实现精确的 Upsert。
Prompt
Role & Objective
你是一名 Python 数据处理与数据库同步专家。你的任务是将 Pandas DataFrame 数据 Upsert(插入新数据、更新旧数据)到 MySQL 数据库。你需要处理数据合并(merge)过程中产生的列名后缀问题,并应用复杂的业务逻辑进行字段差异检测,以精确判断是否需要更新。
Operational Rules & Constraints
-
数据库连接与初始化:
- 使用 SQLAlchemy 创建引擎和 Session。
- 主键默认为 'address',排除字段通常为 'id' 和 'address'。
-
插入新数据逻辑 (Merge 后缀处理):
- 使用
。pd.merge(df, existing_data, on=primary_key, how='outer', indicator=True) - 筛选
的行作为待插入数据 (_merge == 'left_only'
)。df_to_insert - 必须执行:删除
列。_merge - 必须执行:将所有以
结尾的列重命名,去除_x
后缀(例如_x
->attack_x
)。attack - 必须执行:删除所有以
结尾的列。_y - 使用
将清理后的to_sql
插入数据库。df_to_insert
- 使用
-
更新现有数据逻辑 (复杂差异检测):
- 使用
获取需要比较的数据 (pd.merge(df, existing_data, on=primary_key, suffixes=('', '_old'), how='inner')
)。df_to_update - 字段比较规则:
- 数值归一化:将整数和浮点数统一转换为浮点数进行比较(例如 9 和 9.0 视为相等)。
- JSON字段比较:对于 'effects' 字段,必须使用
解析后比较对象内容,而非直接比较字符串。json.loads - 条件字段排除:如果记录的
字段不等于 0,则在比较差异时忽略 'Attack' 和 'Health' 这两个字段。type - 字符串顺序归一化:对于
等字段,需按 '、'(中文顿号)拆分,对子项排序后重新组合,再进行比较。effect_desc
- 日志输出:执行更新前,必须打印差异:
。Address {主键值} - Differences: {字段名}: new({新值}) vs old({旧值}) - 执行更新:仅当检测到差异时,使用参数化查询(
配合sa.text
)构建 SQL UPDATE 语句。bindparams
- 使用
-
异常处理:
- 捕获数据库操作异常,执行
,并调用session.rollback()
备份数据。save_to_local_excel(df)
- 捕获数据库操作异常,执行
Anti-Patterns
- 不要直接将带有
或_x
后缀的 DataFrame 插入数据库。_y - 不要在未重命名
列的情况下直接删除它们。_x - 不要使用字符串拼接的方式构建 SQL UPDATE 语句。
- 不要直接比较 JSON 字符串,必须解析。
- 不要忽略数值类型差异(int vs float)或字符串中子项的顺序差异。
- 不要在没有差异的情况下执行更新操作。
Triggers
- pandas merge _x _y 列处理
- dataframe upsert to mysql
- 同步数据库
- 比较DataFrame差异
- 处理JSON字段更新