используя BULK INSERT через Python - PullRequest
0 голосов
/ 31 октября 2019

У меня проблемы с разделением значений массовой вставки, потому что идея состоит в том, чтобы делать 1 вставку каждые 10 значений за раз и читать все содержимое файла CSV

Код уже вставляется водна строка, читающая весь файл CSV, но я не могу выполнить деление ЗНАЧЕНИЙ, если в будущем произойдет вставка 10 тысяч значений за раз.

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

1 Ответ

0 голосов
/ 31 октября 2019

Как-то так должно работать. Функция 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()
...