最近在写一个爬虫,涉及到大概每天50W条数据的爬取然后进行数据更新和插入,数据库是MySQL,因为SQL语句写的不是很6,所以百度到这样的需求可以用INSERT 中ON DUPLICATE KEY UPDATE 的语句进行不在数据库的数据进行插入和已有数据的更新,语句这里就不多说了,网上很多这样的文章,以下直接上问题:
这是插入语句,url是主键:
cursor.execute("""insert into yyc_pinzhanghao(user, created_at, repin_count,
imgsaves, url, link) values( %s, %s, %s, %s, %s, %s)""",
(param, created_at, repin_count, imgsaves, url, link))
如果url重复那么除了param和url其他字段全部需要更新,这是文档给出的格式写的SQL语句,遗憾的是这是错误的...试了几个格式化方法没有成功...
cursor.execute("""insert into yyc_pinzhanghao(user, created_at, repin_count,
imgsaves, url, link) values( %s, %s, %s, %s, %s, %s) ON DUPLICATE url UPDATE
created_at=value(%s), repin_count=value(%s),
imgsaves=value(%s), link=value(%s))""",
((param, created_at, repin_count, imgsaves, url, link),created_at, repin_count,
imgsaves, link))
为什么不先查询再比对url,因为慢啊,最后只能用笨办法,try语句大法,url不是主键么,重复肯定报错,报错就用update,感觉效率会比先查询再对比再更新或插入快那么一点点...
try:
cursor.execute("""insert into yyc_pinzhanghao(user, created_at, repin_count, imgsaves,
url, link) values(%s, %s, %s, %s, %s, %s)""",
(param, created_at, repin_count, imgsaves, url, link))
except:
cursor.execute("""update yyc_pinzhanghao set created_at='%s', repin_count='%s',
imgsaves='%s', link='%s' where user='%s' and url='%s'""" % (
created_at, repin_count, imgsaves, link, param, url))
这种复杂的SQL语句实在无爱...有大佬会的望指点一二!!!不胜感激