You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 20:50:27