python - 通过 Python 使用 BULK INSERT
问题描述
我在拆分 bulk-insert 的值时遇到问题,因为我的想法是每次每 10 个值插入 1 个并读取 CSV 文件的全部内容
代码已经插入到读取整个 CSV 文件的单行中,但我无法执行 VALUES 的除法,以防将来一次执行 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()
解决方案
像这样的东西应该可以工作。该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()
推荐阅读
- ubuntu-16.04 - 如何使用 Xilinx Petalinux SDK 解决“无法获取 Bitbake 源”
- mongodb - 部署无效的 Terraform + Kubernetes:spec.template.spec.containers[0].envFrom:无效值:“”
- arrays - Excel VBA ARRAY 循环到数据库
- javascript - JavaScript https 获取请求
- react-native - 如何在 react-native 中从浏览器向 Android App 传递一些数据
- java - 我的应用程序从后台回调时显示 ArrayIndexOutOfBoundsException
- android - 如何将我的网站深度链接到应用程序?
- node.js - 将当前用户的 ID 获取到 NodeJS 中方法的 URL
- jupyter-notebook - 一个完整的初学者 - 不能安装 Jupyter 笔记本
- scheme - 方案,连续分数,尾递归