通过Python使用大容量插入

2024-09-25 18:24:09 发布

您现在位置:Python中文网/ 问答频道 /正文

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

代码已经在读取整个CSV文件的单行中插入,但是我无法执行值的划分,在将来的情况下,一次插入10000个值。在

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()

Tags: 文件csvnameidsqlbulkconnreader
1条回答
网友
1楼 · 发布于 2024-09-25 18:24:09

像这样的事情应该行得通。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()

相关问题 更多 >