【问题标题】:using BULK INSERT via Python通过 Python 使用 BULK INSERT
【发布时间】:2019-10-31 02:40:39
【问题描述】:

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

代码已经插入到读取整个 CSV 文件的单行中,但我无法执行 VALUES 的除法,以防将来一次执行 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()

【问题讨论】:

  • 我建议只使用 MySQL 的 LOAD DATA 批量插入工具。无需重新发明轮子并尝试从 Python 脚本手动执行此操作。
  • 该脚本是 ETL 的一部分,它从一个数据库执行 SQL,导出为 CSV,然后将其插入另一个数据库。如果我为 LOAD DATA 执行此操作,我将无法按顺序拆分插入次数。

标签: python mysql csv sql-insert


【解决方案1】:

这样的事情应该可以工作。 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()

【讨论】:

  • 感谢您的帮助。在测试中,我执行的插入是正确的,但我只是怀疑它是在单行还是多行,因为你在“executemany”中施加了力量为了进一步解释我的疑问,INSERT 命令应该像这样工作...... @987654326 @...不是这样的...INSERT INTO user (id,username) VALUES (1,'name'),(2,'name),(3,'name'),(4,'name')...我觉得应该乱用a.commit()来批量做INSERT。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-29
  • 2014-09-16
相关资源
最近更新 更多