脚本之家,脚本语言编程技术及教程分享平台!
分类导航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服务器之家 - 脚本之家 - Python - python数据库批量插入数据的实现(executemany的使用)

python数据库批量插入数据的实现(executemany的使用)

2021-10-24 10:04芝麻芋圆 Python

这篇文章主要介绍了python数据库批量插入数据的实现(executemany的使用),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

正常情况下往数据库多张表中批量插入1000条数据,若一条一条insert插入,则调用sql语句查询插入需要执行几千次,花费时间长

现使用cursor.executemany(sql,args) ,可对数据进行批量插入,
其中args是一个包含多个元组的list列表,每个元组对应mysql当中的一条数据

以下是实例:
往数据库中的order表、order_detail表和pay表中插入1000条订单数据,订单详情数据以及支付数据
1.pay表中的id字段是order表中的pay_id字段
2.order表中的id字段是order_detail表中的order_id字段

1.初始化属性(包括host、port、user、password和database)

?
1
2
3
4
5
6
def __init__(self):
        self.__db_host=XXX
        self.__db_port=XXX
        self.__db_user=XXX
        self.__db_password=XXX
        self.__db_database=XXX

2.连接数据库

?
1
2
3
4
5
6
7
8
9
def isConnection(self):
        self.__db=pymysql.connect(
            host=self.__db_host,
            port=self.__db_port,
            user=self.__db_user,
            password=self.__db_password,
            database=self.__db_database,
            charset='utf8'
        )

3.批量往pay表中插入1000条数据

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 插入数据进pay表
    def pay_insert(self,pay_value):
        try:
            # 连接数据库
            self.isConnection()
            # 创建游标
            global cursor
            cursor=self.__db.cursor()
            # 执行
            cursor.executemany('insert into `pay表`(type,pay_money,pay_time,pay_no,STATUS,create_by,create_time,update_by,update_time) value (%s,%s,%s,%s,%s,%s,%s,%s,%s)',pay_value)
        except Exception as e:
            print e
        finally:
            cursor.close()
            self.__db.commit()
            self.__db.close()
 
    # 生成pay表所需字段,并调用sql
    def pay_data(self):
        pay_value=list()
        for i in range(1,1000):
            pay_value.append((0,8800,time.localtime(),str(random.randint(712300000000,712399999999)),3,49338,time.localtime(),49338,time.localtime()))
        now_time=time.localtime()
        self.pay_insert(pay_value)
        return now_time

4.pay表中生成的1000条数据,依次取出id

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 获取pay_id
   def get_pay_id(self,now_time):
       try:
           self.isConnection()
           global cursor
           cursor=self.__db.cursor()
           cursor.execute('select id from `pay表` where create_time >= %s',now_time)
           id_value=list()
           for i in range(1,1000):
               pay_id=cursor.fetchone()
               id_value.append(pay_id)
           return id_value
       except Exception as e:
           print e
       finally:
           cursor.close()
           self.__db.commit()
           self.__db.close()

 以下是完整代码:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
# #!/usr/bin/python
# # -*- coding: UTF-8 -*-
 
 
import pymysql          # 先pip install pymysql
import random
import time
 
class DatabaseAcess:
    # 初始化属性(包括host、port、user、password和database)
    def __init__(self):
        self.__db_host=XXX
        self.__db_port=XXX
        self.__db_user=XXX
        self.__db_password=XXX
        self.__db_database=XXX
 
    # 连接数据库
    def isConnection(self):
        self.__db=pymysql.connect(
            host=self.__db_host,
            port=self.__db_port,
            user=self.__db_user,
            password=self.__db_password,
            database=self.__db_database,
            charset='utf8'
        )
 
 
    # 插入数据进pay表
    def pay_insert(self,pay_value):
        try:
            # 连接数据库
            self.isConnection()
            # 创建游标
            global cursor
            cursor=self.__db.cursor()
            # 执行
            cursor.executemany('insert into `pay表`(type,pay_money,pay_time,pay_no,STATUS,create_by,create_time,update_by,update_time) value (%s,%s,%s,%s,%s,%s,%s,%s,%s)',pay_value)
 
        except Exception as e:
            print e
        finally:
            cursor.close()
            self.__db.commit()
            self.__db.close()
 
 
    # 生成pay表所需字段,并调用sql
    def pay_data(self,data_number):
        pay_value=list()
        for i in range(1,data_number):
            pay_value.append((0,8800,time.localtime(),str(random.randint(712300000000,712399999999)),3,49338,time.localtime(),49338,time.localtime()))
        now_time=time.localtime()
        self.pay_insert(pay_value)
        return now_time
 
 
    # 获取pay_id
    def get_pay_id(self,now_time,data_number):
        try:
            self.isConnection()
            global cursor
            cursor=self.__db.cursor()
            cursor.execute('select id from `pay表` where create_time >= %s',now_time)
            id_value=list()
            for i in range(1,data_number):
                pay_id=cursor.fetchone()
                id_value.append(pay_id)
            return id_value
        except Exception as e:
            print e
        finally:
            cursor.close()
            self.__db.commit()
            self.__db.close()
 
 
    # 插入数据进order表
    def order_insert(self,order_value):
        try:
            self.isConnection()
            global cursor
            cursor=self.__db.cursor()
            cursor.executemany('insert into `order表` (student_name,student_id,school_id,school_name,tel,height,sex,pay_id,order_no,status,original_price,payment_price,order_type,create_by,create_time,update_by,update_time,purchase_id,dept_id,sub_order_mid,class_name,shoe_size,student_no,weight) value (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)',order_value)
        except Exception as e:
            print e
        finally:
            cursor.close()
            self.__db.commit()
            self.__db.close()
 
 
    # 生成order表所需字段,并调用sql
    def order_data(self,id_value,data_number):
        order_value=list()
        for i in range(1,data_number):
            pay_id=str(id_value[i-1]).replace("L,)","").replace("(","")
            order_value.append(("周瑜",35999,346,"A城小学","13322222222",130,1,pay_id,str(random.randint(7100000000,7999999999)),2,8800,8800,1,49338,time.localtime(),49338,time.localtime(),405,121,564123698745632,"三年级 3班",30,30,30))
        sys_time=time.localtime()
        self.order_insert(order_value)
        return sys_time
 
 
    # 获取order_id
    def get_order_id(self,sys_time,data_number):
        try:
            self.isConnection()
            global cursor
            cursor=self.__db.cursor()
            cursor.execute('select id from `order表` where create_time >= %s',sys_time)
            order_id_list=list()
            for i in range(1,data_number):
                order_id_list.append(cursor.fetchone())
            return order_id_list
        except Exception as e:
            print e
        finally:
            cursor.close()
            self.__db.commit()
            self.__db.close()
 
 
    # 插入数据进order_detail表
    def order_detail_insert(self,detail_value):
        try:
            self.isConnection()
            global cursor
            cursor=self.__db.cursor()
            cursor.executemany('insert into `order_details表` (order_id,commodity_name,commodity_id,original_price,payment_price,img,number,status,create_by,create_time,update_by,update_time) value (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)',detail_value)
        except Exception as e:
            print e
        finally:
            cursor.close()
            self.__db.commit()
            self.__db.close()
 
 
    # 生成order_detail表所需字段,并调用sql
    def order_detail_data(self,order_id_list,data_number):
        detail_value=list()
        for i in range(1,data_number):
            order_id=str(order_id_list[i-1]).replace("L,)","").replace("(","")
            detail_value.append((order_id,"A城小学春季校服","1382932636506902530",8800,8800,"https://ygxf-dev2.obs.cn-north-1.myhuaweicloud.com:443/image%2F1618551784845-589.jpg",1,2,49338,time.localtime(),49338,time.localtime()))
        self.order_detail_insert(detail_value)
 
 
if __name__ == '__main__':
    db=DatabaseAcess()
    data_number=3
    db.order_detail_data(order_id_list=db.get_order_id(sys_time=db.order_data(id_value=db.get_pay_id(now_time=db.pay_data(data_number=data_number),data_number=data_number),data_number=data_number),data_number=data_number),data_number=data_number)
    print ("{0}条数据插入完成".format(data_number-1))

到此这篇关于python数据库批量插入数据的实现(executemany的使用)的文章就介绍到这了,更多相关python数据库批量插入 内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/weixin_43848422/article/details/116236801

延伸 · 阅读

精彩推荐