我在拆分bulk-insert的值时遇到了问题,因为这样做的目的是让每10个值一次插入一次,然后读取CSV文件的全部内容
代码已经插入到读取整个CSV文件的一行中,但我无法在将来执行值的除法,一次插入10,000个值。
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()发布于 2019-10-31 15:56:04
像这样的东西应该是可行的。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()https://stackoverflow.com/questions/58636237
复制相似问题