首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过Python使用大容量插入

通过Python使用大容量插入
EN

Stack Overflow用户
提问于 2019-10-31 10:40:39
回答 1查看 1K关注 0票数 0

我在拆分bulk-insert的值​​时遇到了问题,因为这样做的目的是让每10个值​​一次插入一次,然后读取CSV文件的全部内容

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

代码语言:javascript
复制
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()
EN

回答 1

Stack Overflow用户

发布于 2019-10-31 15:56:04

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

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

cursor.executemany可以像在原始函数中一样批量执行SQL插入,尽管这是依赖于实现的,应该进行测试。

代码语言:javascript
复制
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()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58636237

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档