簡體   English   中英

通過 Python 使用 BULK INSERT

[英]using BULK INSERT via Python

我在拆分 bulk-insert 的值時遇到問題,因為我的想法是每次每 10 個值插入 1 個並讀取 CSV 文件的全部內容

代碼已經插入到讀取整個 CSV 文件的單行中,但是在將來一次插入 10000 個值的情況下,我無法執行 VALUES 的除法。

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

像這樣的東西應該可以工作。 batch_csv function 是一個生成器,它在每次迭代時生成大小size的行列表。

bulk_insert function 被修改為使用參數替換和游標的executemany方法。 參數替換比手動構造 SQL 更安全。

cursor.executemany可以像在原始 function 中一樣批處理 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()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM