Airflow使用PostgresHook做upsert已存在唯一索引仍报错如何解决
问题原因
你遇到的报错是Airflow PostgresHook的insert_rows方法实现upsert逻辑的必填参数缺失导致的,哪怕表上已经存在唯一索引,也需要你手动指定冲突判断对应的字段,Hook不会主动读取数据库元数据自动识别唯一索引。
解决方法
调用insert_rows时,除了replace=True,额外添加conflict_cols参数指定你的联合唯一键字段team和year即可,修改后的代码如下:
pg_conn.insert_rows('kenpom', list(df.itertuples(index=False)), target_fields=['rank', 'team', 'ortg', 'drtg', 'year'], replace=True, conflict_cols=['team', 'year'])
补充说明
- 如果你使用的是较低版本的Airflow Postgres Provider包,
conflict_cols参数可能名为replace_index,参数值同样传入['team', 'year']即可。 - 建议再次确认表上的联合唯一索引字段名、顺序是否和传入的
conflict_cols完全一致,避免因拼写、字段顺序问题仍然报错。
内容的提问来源于stack exchange,提问作者Evan Zamir
相关产品推荐
相关产品推荐

