版权声明:诸葛老刘所有 https://blog.csdn.net/weixin_39791387/article/details/84394435
最近工作中遇到一些需求,需要对数据库所有数据进行批量的操作,
即: 存在在则更新,不存在则新增.
# 语句如下:
insert into test_tbl (id,dr)
values (1,'2'),(2,'3'),...(x,'y')
on duplicate key update dr=values(dr);
/*解析:
test_tbl 是表名
(id, dr) 是该的两个字段,
(1, '2'), (2, '3'),...(x, 'y')则需要插入的值
update dr = values(dr) 存在则更新
*/
# 例子:
insert into book (`Id`,`Author`,`CreatedTime`,`UpdatedTime`)
values (1,'张飞2','2017-12-12 12:20','2017-12-12 12:20'),
(2,'关羽2','2017-12-12 12:20','2017-12-12 12:20')
on duplicate key update
Author=values(Author),
CreatedTime=values(CreatedTime),
UpdatedTime=values(UpdatedTime);
扩展:
# 使用case when 方法
UPDATE test_tbl
SET name = CASE id
WHEN 1 THEN '刘德华'
WHEN 2 THEN '张学友'
WHEN 3 THEN '张国荣'
END,
name_py = CASE id
WHEN 1 THEN 'ldf'
WHEN 2 THEN 'zxy'
WHEN 3 THEN 'zgr'
END
WHERE id IN (1,2,3)
批量更新解决思路:
若有10000条数据需要进行’update’, 那就分批进行commit()
下面是具体的实现: (未测试)
使用的sql语句是:
sql_one = '''update schma.table set col = {val} where col2 = {val2}'''
# 其中的schma是指数据库
# table是指数据表
# col是需要更新的字段名
# val是需要更新的值
# col2 = val2是受影响的行
# 总体意思是:将schma数据库的table表中的col2 = {val2} 这些行中的 col列的值更新为 {val}
# 带{为变量}
import pymysql
import logging
logging.basicConfig(level=logging.DEBUG,
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
logger = logging.getLogger(__name__)
conn = pymysql.connect() # 创建数据库连接
val_list = [('test1', 1), ('test2', 2)...]
i = 0
for val in val_list:
sql = sql_one.format(val=val[0], val2=val[1])
try:
cur = conn.cursor()
a = cur.execute(sql)
except Exception as e:
conn.rollback()
logger.debug(e)
else:
i += 1
if i == 1000: # 当 i == 1000时提交事务且将i重置为0
i = 0
conn.commit()
conn.commit() # 兜底提交
cur.close()
conn.close()