将Pandas DataFrame写入MySQL数据仓库时遇SQL语法错误求助
解决MariaDB/MySQL插入date_dim表的语法错误问题
嘿,这个问题的根源一眼就能看出来——你的SQL语句里NOT EXISTS子句没写完!MariaDB/MySQL的NOT EXISTS必须搭配一个子查询来指定重复判断条件,不然数据库根本不知道要验证什么“不存在”,直接抛出1064语法错误是必然的。
问题分析
你原来的SQL写到WHERE NOT EXISTS就戛然而止了,缺少了核心的子查询部分。这个子查询需要关联临时表date_dim_temp和目标表date_dim,用来判断目标表中是否已经存在要插入的记录,以此避免重复数据。
修正后的解决方案
根据你的date_dim表结构,我们可以按主键或业务唯一标识来判断重复,下面是两种常用的写法:
1. 按主键id判断重复
with dwh.begin() as cn: sql = """ INSERT INTO date_dim (id, created_at, month_num, month_day, year, week_day) SELECT temp.id, temp.created_at, temp.month_num, temp.month_day, temp.year, temp.week_day FROM date_dim_temp temp WHERE NOT EXISTS ( SELECT 1 FROM date_dim d WHERE d.id = temp.id ) """ cn.execute(sql)
2. 按业务日期created_at判断重复(更适配日期维度表)
如果你的date_dim是日期维度表,通常created_at是唯一的日期值,用这个字段判断重复更贴合业务逻辑:
with dwh.begin() as cn: sql = """ INSERT INTO date_dim (id, created_at, month_num, month_day, year, week_day) SELECT temp.id, temp.created_at, temp.month_num, temp.month_day, temp.year, temp.week_day FROM date_dim_temp temp WHERE NOT EXISTS ( SELECT 1 FROM date_dim d WHERE d.created_at = temp.created_at ) """ cn.execute(sql)
额外小技巧:用Pandas直接加载更省心
既然你已经有了Pandas DataFrame,其实可以直接用to_sql方法配合SQLAlchemy连接,不用手动写INSERT语句:
# 假设你的日期维度数据DataFrame名为date_df date_df.to_sql( name='date_dim', con=dwh, if_exists='append', index=False, method='multi' # 批量插入提升加载效率 ) # 如果要严格避免重复,可以先在DataFrame层面过滤掉已存在的记录再插入
内容的提问来源于stack exchange,提问作者LeoGER
相关产品推荐
相关产品推荐

