【发布时间】:2020-10-18 22:12:09
【问题描述】:
我创建了一个 web 请求,将数据转换为 json 格式,然后解析它以加载到数据库表,如下所示:
def loaddata(request):
if request.method == "POST":
url = 'apiurl'
response = requests.get(url,stream=True)
data = response.json()
for i,item in enumerate(data):
records = Model.objects.create(
empl = data.get('empl',None),
name = data.get('empl',None).get('name',None))
records.save()
return render(request,"main.html")
目前这会逐条处理数据,这使得它非常慢。我还在下面的 url 中读到,这可以通过 sql 批量插入轻松完成。
http://stefano.dissegna.me/django-pg-bulk-insert.html
具体指以下描述的部分:
SQL 批处理 INSERT 我们可以通过构建单个 SQL 做得更好 INSERT 语句一次创建多条记录,类似于 bulk_create 构建的 SQL:
导入工具
从上下文库导入关闭
从 django.db 导入连接从 django.utils 导入时区
def sql_batch_insert(n_records): sql = 'INSERT INTO app_testmodel (field_1, field_2, field_3) VALUES {}'.format( ', '.join(['(%s, %s, %s)'] * n_records), ) 参数 = [] 对于 xrange(0, n_records) 中的 i: params.extend([i, str(i), timezone.now()])
with closing(connection.cursor()) as cursor: cursor.execute(sql, params)如果 name == 'main': utils.timed(sql_batch_insert) 手动构建 SQL 查询比使用 bulk_create 给代码增加了更多的噪音,但除此之外 没有明显的缺点:
$ python sql_batch_insert.py 在 167 毫秒内创建了 10000 条记录 性能与 bulk_create 处于同一数量级,并且与 我们在将标准 ORM create() 方法与简单方法进行比较时看到 SQL INSERT 语句,ORM 开销不小。
但是我是编程和 django 的新手,因此我无法理解如何转换现有代码以使用它来更快地处理数据并批量加载。
请注意:我也尝试使用 django bulk_create,因为我获得了大约 30 万条数据记录,并且收到了“违反唯一约束”的错误。
任何专家都可以帮我解决这个问题,并指导我如何将其转换为 sql 批量插入,这样可以更快地将数据加载到我的数据库中。
非常感谢。
【问题讨论】: