python百万级以下数据量 任意二维list 插入mysql的动态语句方法

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')
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值