业务场景:数据采集(爬虫)时需要对采集的数据多次采集【目的是更上网站数据变化的步伐】,比如采集人员,两次采集到同一个人的信息(第二次采集时人员的信息变化了)时,需要对数据进行覆盖
一般的操作流程是:
- 先根据PRIMARY_KEY或UNIQUE字段查询库里是否存在数据(select。。。);
- 如果存在数据,则更改许要更改的字段(update。。。);
- 如果不粗在数据,则进行添加新数据(insert。。。);
- 代码示例
-
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就会根据该自动判断该字段去做查询,如果存在则更改其他字段的值,如果不存在则将新的数据添加。
致辞完毕,感谢各位父老乡亲前来观看