Python三种批量插入方式对比

在使用Python进行数据处理和存储时,批量插入是一种常见的需求。批量插入可以提高数据插入的效率,减少数据库操作的次数,从而减少程序的执行时间。本文将介绍Python中三种常见的批量插入方式,并对它们进行比较。

1. 使用循环插入

最简单的批量插入方式就是使用循环来逐条插入数据。代码如下所示:

import mysql.connector

def insert_data(data):
    conn = mysql.connector.connect(host='localhost', user='root', password='123456', database='test')
    cursor = conn.cursor()
  
    for item in data:
        sql = "INSERT INTO table_name (field1, field2, field3) VALUES (%s, %s, %s)"
        cursor.execute(sql, (item['field1'], item['field2'], item['field3']))
    
    conn.commit()
    cursor.close()
    conn.close()

data = [
    {'field1': 'value1', 'field2': 'value2', 'field3': 'value3'},
    {'field1': 'value4', 'field2': 'value5', 'field3': 'value6'},
    {'field1': 'value7', 'field2': 'value8', 'field3': 'value9'}
]

insert_data(data)

这种方式的优点是简单直观,容易理解和实现。但是,由于每次都需要与数据库进行一次交互,大量的数据库操作会带来较高的开销,降低了插入的效率。

2. 使用executemany方法批量插入

Python的MySQL驱动提供了executemany方法来进行批量插入。该方法可以一次性插入多条数据,减少与数据库的交互次数,提高插入的效率。代码如下所示:

import mysql.connector

def insert_data(data):
    conn = mysql.connector.connect(host='localhost', user='root', password='123456', database='test')
    cursor = conn.cursor()
    
    sql = "INSERT INTO table_name (field1, field2, field3) VALUES (%s, %s, %s)"
    values = [(item['field1'], item['field2'], item['field3']) for item in data]
    cursor.executemany(sql, values)
  
    conn.commit()
    cursor.close()
    conn.close()

data = [
    {'field1': 'value1', 'field2': 'value2', 'field3': 'value3'},
    {'field1': 'value4', 'field2': 'value5', 'field3': 'value6'},
    {'field1': 'value7', 'field2': 'value8', 'field3': 'value9'}
]

insert_data(data)

这种方式通过一次数据库交互插入多条数据,大大提高了插入的效率。但是,由于数据量过大时,可能会出现内存占用过高的问题。

3. 使用LOAD DATA INFILE语句批量插入

MySQL提供了LOAD DATA INFILE语句,可以将数据直接从文件中导入数据库,这种方式是最快的批量插入方式。首先,将数据保存到文件中,代码如下所示:

import csv

data = [
    {'field1': 'value1', 'field2': 'value2', 'field3': 'value3'},
    {'field1': 'value4', 'field2': 'value5', 'field3': 'value6'},
    {'field1': 'value7', 'field2': 'value8', 'field3': 'value9'}
]

with open('data.csv', 'w', newline='') as file:
    writer = csv.writer(file)
    writer.writerow(data[0].keys())
    for item in data:
        writer.writerow(item.values())

然后,使用LOAD DATA INFILE语句将文件中的数据导入数据库,代码如下所示:

import mysql.connector

def insert_data():
    conn = mysql.connector.connect(host='localhost', user='root', password='123456', database='test')
    cursor = conn.cursor()
    
    sql = "LOAD DATA INFILE 'data.csv' INTO TABLE table_name FIELDS TERMINATED BY ','"
    cursor.execute(sql)
  
    conn.commit()
    cursor.close()
    conn.close()

insert_data()

这种方式可以将大量数据批量导入数据库,速度非常快。但是,需要将数据保存到文件中,增