list是python中非常常用的数据类型,和mysql中的数据表有很大的相似之处。把list数据插入到mysql中是一个比较常用的操作。但是有事需要插入的字段和表格名称都是变动的,那么就会导致sql语句经常不同。我这里我是用了{}和format方法根据参数动态的创建sql语句。
特点:
为了提高效率,每500个插入语句提交一次事务。
已经测试在20W到70W的量是可以稳定工作的。
为了便于多次利用,我把数据操作分装到一个类中。
类初始时候就会自动创建数据库链接。
import pymysql.cursors
from log2022 import *
class Database:
connected = False
__conn = None
log3 = Logger()
# 构造函数,初始化时直接连接数据库
def __init__(self):
conf = {'host': '127.0.0.1',
'port': 3306,
'user': '12345',
'pw': '12345',
'db': '12345'
}
if type(conf) is not dict:
print('错误: 参数不是字典类型!')
else:
for key in ['host', 'port', 'user', 'pw', 'db']:
if key not in conf.keys():
print('错误: 参数字典缺少 %s' % key)
if 'charset' not in conf.keys():
conf['charset'] = 'utf8'
try:
self.__conn = pymysql.connect(
host=conf['host'],
port=conf['port'],
user=conf['user'],
passwd=conf['pw'],
db=conf['db'],
charset=conf['charset'],
cursorclass=pymysql.cursors.DictCursor)
self.connected = True
except pymysql.Error as e:
print('数据库连接失败:', end='')
def insert_list(self, table, field_str, dblist, key=""):
# table 表名
# field_str 需要插入数据的字段名
# dblist 需要插入数据的二维表
# key = "" 需要特殊作用的sql语句段
db = self.__conn
# 类初始化变量 数据库链接
cursor = db.cursor()
try:
sql = 'START TRANSACTION;'
cursor.execute(sql)
i = 0
for dbbline in dblist:
# 根据list长度确定占位符的个数
vv = ""
for mydb in dbbline:
vv = vv + "'{}',"
vv = vv[:-1]
# 去掉最后多余的逗号
if key == "":
# 拼凑出基本的aql语句
# 使用replace是为了解决索引储重复的问题
sql_str = "replace into " + table + " (" + field_str + ") values(" + vv + ");"
# 把list的地址传给format函数利用list内的数据替换占位符
dbsql = sql_str.format(*dbbline)
else:
'''
key 默认值是“”
当如如下需要的时候可以额使用key参数
INSERT INTO user_admin_t (_id,password)
VALUES ('1','第一次插入的密码')
ON DUPLICATE KEY UPDATE
_id = 'UpId',
password = 'upPassword';
'''
sql_str = "insert into " + table + " (" + field_str + ") values(" + vv + ");"
dbsql = sql_str.format(*dbbline)
# 注意sql语句的结束符
dbsql = dbsql[:-1] + key+";"
cursor.execute(dbsql)
i = i + 1
if i % 500 == 0:
sql = 'COMMIT;'
cursor.execute(sql)
sql = 'START TRANSACTION;'
cursor.execute(sql)
self.log3.logger.info('正在进行数据库缓存,已经缓存{}条'.format(i))
sql = 'COMMIT;'
cursor.execute(sql)
return 0
except pymysql.Error as e:
print(e)
return e
可以在需要插入数据库的类型继承这个数据库操作类。然后调用insert_list方法
根据参数不同会调用不同的sql拼接方法。
self.insert_list("wx_q", "wx_q_name,wx_q_ID,creat_time,city", new_qun)
fs="wx_q,msg_time,msg,tel,wx_id,wx_name,count,msg_scol,q_ID,city"
self.insert_list('msg_s3',fs,self.chuli(),'ON DUPLICATE KEY UPDATE count=count+1')