python+mysql实现数据覆盖式更新(数据采集中做去重处理)

业务场景:数据采集(爬虫)时需要对采集的数据多次采集【目的是更上网站数据变化的步伐】,比如采集人员,两次采集到同一个人的信息(第二次采集时人员的信息变化了)时,需要对数据进行覆盖

一般的操作流程是:

  1. 先根据PRIMARY_KEY或UNIQUE字段查询库里是否存在数据(select。。。);
  2. 如果存在数据,则更改许要更改的字段(update。。。);
  3. 如果不粗在数据,则进行添加新数据(insert。。。);
  4. 代码示例
  5. import pymysql
    import ipdb
    
    conn = pymysql.connect(
        host='xxxx',
        user='xxxx',
        password='xxxx',
        db='xxxx',
        charset='utf8',
    )
    cursor = conn.cursor()
    
    # 先添加一条测试数据(假如我们第一次采集到一条数据)[NameUniqueID为唯一索引字段]
    addSQL = "insert into test(`name`,NameUniqueID,age,sex,hobby)values(%s,%s,%s,%s);"
    params = ('小罗', '0001', 15, '男', '打篮球')
    cursor.execute(addSQL, params)
    conn.commit()
    
    
    
    
    
    # 程序中途崩了,改好代码之后重新采集,又采到了这条数据,我们需要对数据进行去重,一般逻辑是先根据唯一# 索引字段查询库里是否存在该唯一键的值;
    
    # 第一步,先查询数据库
    SearchSQL = "SELECT 1 FROM test WHERE NameUniqueID='0001';"
    cursor.execute(SearchSQL)
    result = cursor.fecthone()
    
    
    # 第二步:判断该人员数据是否存在。(存在数据则先将库里的数据进行删除)
    if result:
        DelSQL = "DELETE FROM test WHERE NameUniqueID='0001';"
        cursor.execute(DelSQL)
        conn.commit()
    
    
    # 第三步:最后将第二次采集的数据添加到库里
    Add_SQL = "INSERT INTO test(`name`,NameUniqueID,age,sex,bobby)VALUES(%s,%s,%s,%s);"
    params = ('小罗', '0001', 15, '男', '打篮球,还喜欢吃屎')  # 这里人员的hobby字段发生了变化
    cursor.execute(ADD_SQL)
    conn.commit()
    
    
    # 最后关闭数据库连接!!!【不关闭将导致数据库连接过多而连不上数据库】
    cursor.close()
    conn.close()
    

     

以上需要分成3个步骤(非原子性操作)。

但是mysql提供了符合这种业务场景的操作方式,一句SQL就能实现以上三个步骤。看代码:

import pymysql
import ipdb

conn = pymysql.connect(
    host='xxxx',
    user='xxxx',
    password='xxxx',
    db='xxxx',
    charset='utf8',
)
cursor = conn.cursor()

# 先添加一条测试数据(假如我们第一次采集到一条数据)[NameUniqueID为唯一索引字段]
addSQL = "INSERT INTO test(`name`,NameUniqueID,age,sex,hobby)VALUES(%s,%s,%s,%s);"
params = ('小罗', '0001', 15, '男', '打篮球')
cursor.execute(addSQL, params)
conn.commit()


# 我们只需要将上线SQL进行稍微改动一下就行。mysql会自动判断

addSQL = """
        INSERT INTO 
        test(`name`,NameUniqueID,age,sex,hobby)
        VALUES(%s,%s,%s,%s) 
        ON DUPLICATE KEY 
        UPDATE     
`name`=VALUES(`name`),NameUniqueID=VALUES(NameUniqueID),age=VALUES(age),sex=VALUES(age),hobby=VALUES(bobby);"""
params = ('小罗', '0001', 15, '男', '打篮球,喜欢吹牛b')

上面的SQL是在原来的基础上添加【ON DUPLICATE KEY UPDATE col_1="value_1" , col_2="value_2"】,只要UPDATE后面要修改的字段中有主键或唯一键的值,mysql就会根据该自动判断该字段去做查询,如果存在则更改其他字段的值,如果不存在则将新的数据添加。

致辞完毕,感谢各位父老乡亲前来观看

 

  • 4
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值