Python操作MySQL:仅当记录不存在时插入数据的问题及解决
问题:Python脚本实现ArtNrLong不存在时插入数据
表结构
我有一个名为artPerBrand的文章表,结构如下:
- ID:自增列
- BrandID
- ArtCat
- ArtNrShort
- ArtNrLong
- Active
需求
需要通过Python脚本插入新文章,但仅当表中不存在相同的ArtNrLong时才执行插入。由于业务场景允许ArtNrLong重复,因此无法给该字段添加唯一约束。
错误写法及问题分析
第一种错误写法
cur.execute ("INSERT INTO artPerBrand (BrandID, ArtCat, ArtNrShort, ArtNrLong, Active)\ select * from (Select" + varBrandID, varArtCat, varArtNrShort, varArtNrLong,1 +") as temp \ where not exists (Select ArtNrLong from artPerBrand where ArtNrLong="+varArtNrLong+") LIMIT 1")
问题点:
- 字符串拼接语法错误:变量与SQL字符串拼接时未正确处理分隔逻辑,导致生成的SQL语句语法混乱
- 存在SQL注入风险:直接将变量拼入SQL是不安全的写法
- 子查询写法冗余且不符合规范
第二种错误写法
sql = "INSERT INTO artPerBrand(BrandID, ArtCat, ArtNrShort, ArtNrLong, Active) VALUES (%s, %s, %s, %s, %s) WHERE NOT EXISTS (SELECT * FROM artPerBrand WHERE ArtNrLong = %s)" val = (varBrandID, varArtCat, varArtNrShort, varArtNrLong 1, varArtNrLong) cur.execute(sql, val)
问题点:
- SQL语法错误:
INSERT...VALUES语句后不能直接跟WHERE条件,标准SQL不支持这种写法 - Python语法错误:
val元组中varArtNrLong 1缺少逗号,应为varArtNrLong, 1
正确解决方案
采用INSERT...SELECT结合DUAL表(MySQL专用临时表,用于生成单行数据)的写法,同时使用参数化查询避免SQL注入:
sql = "INSERT INTO artPerBrand(BrandID, ArtCat, ArtNrShort, ArtNrLong, Active) SELECT %s, %s, %s, %s, %s FROM DUAL WHERE NOT EXISTS (SELECT * FROM artPerBrand WHERE ArtNrLong = %s)" val = (varBrandID, varArtCat, varArtNrShort, varArtNrLong, 1, varArtNrLong) cur.execute(sql, val)
说明:
- 用
SELECT...FROM DUAL替代VALUES,通过WHERE NOT EXISTS判断是否存在重复的ArtNrLong,满足仅在不存在时插入的需求 - 参数化查询(
%s占位符)既保证了语法正确,又避免了SQL注入风险 - 修正了
val元组中的逗号问题,确保参数传递正确
内容的提问来源于stack exchange,提问作者hacking_mike
相关产品推荐
相关产品推荐

