如何实现数据库新增记录时的重复检测与跳过逻辑?
解决数据库插入前的重复记录检查问题
核心问题修正
你之前的代码无法生效,主要是3个问题:
- Python的数据库游标没有
exists()函数,不能直接这么用 - 查询语句直接写变量会触发SQL注入,且MySQL会把变量识别为字段名
- INSERT语句的列数和传入的值数量不匹配(你写了8个列,但传了9个值)
修正后的完整代码
# 简化空链接判断,直接用布尔值 control = link != "" if control: # 1. 检查当前link是否已存在于ad_l表的link列 check_query = "SELECT 1 FROM ad_l WHERE link = %s" # 用参数化查询避免SQL注入,注意单元素元组要加逗号 cursor.execute(check_query, (link,)) # 能查到结果则说明记录已存在 record_exists = cursor.fetchone() is not None if record_exists: print('该链接已存在,跳过添加') else: # 2. 插入新记录,修正列数和值的匹配问题(添加link列) insert_query = """ INSERT INTO ad_l(id, count, clist_id, brand_model, ad, link, created_at, updated_at, status) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s) """ val = (id, count, clist_id, brand_model, ad_link, link, created_at, updated_at, status) cursor.execute(insert_query, val) scrap_db.commit() print(cursor.rowcount, "记录成功插入到*ad_l*表")
可选:用链接中的id进行检查
如果想通过链接里的id(而非完整链接)判断重复,先从link中提取id,再修改检查语句:
# 示例:从link提取id,假设link格式为"https://xxx.com/ad/12345" extracted_id = link.split("/")[-1] # 修改检查语句为针对id列 check_query = "SELECT 1 FROM ad_l WHERE id = %s" cursor.execute(check_query, (extracted_id,)) record_exists = cursor.fetchone() is not None
额外提示
- 建议给ad_l表的link列(或id列)添加唯一索引,从数据库层面避免重复,防止并发插入时出现重复记录
- 批量处理时,可以用
executemany配合INSERT ... ON DUPLICATE KEY UPDATE语法,效率更高
内容的提问来源于stack exchange,提问作者B.12
相关产品推荐
相关产品推荐

