首页 > 解决方案 > 通过 Python 使用 BULK INSERT

问题描述

我在拆分 bulk-insert 的值时遇到问题,因为我的想法是每次每 10 个值插入 1 个并读取 CSV 文件的全部内容

代码已经插入到读取整个 CSV 文件的单行中,但我无法执行 VALUES 的除法,以防将来一次执行 10,000 个值的插入。

def bulk_insert(table_name, **kwargs):

    mysqlConnection = MySqlHook(mysql_conn_id='id_db')
    a = mysqlConnection.get_conn()
    c = a.cursor()

    with open('/pasta/arquivo.csv') as f: 
        reader = csv.reader(f, delimiter='\t')

        sql ="""INSERT INTO user (id,user_name) VALUES""" 

            for row in reader:           
                sql +="(" + row[0] + " , '" + row[1] + "'),"
            c.execute(sql[:-1])  

    a.commit()

标签: pythonmysqlcsvsql-insert

解决方案


像这样的东西应该可以工作。该batch_csv函数是一个生成器,它size在每次迭代时产生一个大小行的列表。

bulk_insert 函数被修改为使用参数替换和游标的executemany方法。参数替换比手动构造 SQL 更安全。

cursor.executemany可以像在原始函数中一样批处理 SQL 插入,尽管这取决于实现并且应该进行测试。

def batch_csv(size=10):
    with open('/pasta/arquivo.csv') as f: 
        reader = csv.reader(f, delimiter='\t')
        batch = []
        for row in reader:
            batch.append(row)
            if len(row) == size:
                yield batch
                del batch[:]
        yield batch


def bulk_insert(table_name, **kwargs):

    mysqlConnection = MySqlHook(mysql_conn_id='id_db')
    a = mysqlConnection.get_conn()
    c = a.cursor()
    sql ="""INSERT INTO user (id,user_name) VALUES (%s, %s)""" 
    batcher = batch_csv()
    for batch in batcher:
        c.executemany(sql, [row[0:2] for row in batch])  

    a.commit()

推荐阅读