【问题标题】:How load json data to table faster django如何更快地将 json 数据加载到表中 django
【发布时间】: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 == 'ma​​in': 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 批量插入,这样可以更快地将数据加载到我的数据库中。

非常感谢。

【问题讨论】:

    标签: python sql django oracle


    【解决方案1】:

    您可以使用.bulk_create(…) [Django-doc]same 查询中创建所有对象:

    def loaddata(request):
       if request.method == 'POST':
          url = 'apiurl'
          response = requests.get(url,stream=True)
          data = response.json()
          records = [
              Model(
                  empl = data.get('empl',None),
                  name = data.get('empl',None).get('name',None)
              )
              for item in data
          ]
          Model.objects.bulk_create(records)
        return render(request, 'main.html')

    因此,我们首先列出Model 对象(我们尚未保存到数据库中),然后调用Model.objects.bulk_create(…) 一次保存所有这些元素。

    【讨论】:

    • 谢谢威廉。只是对我帖子中网址中提到的时间感到好奇。与批量创建/ORM 相比,SQL 批处理显示更少的处理时间。你能告诉我是否会这样吗?我有将近 120 列数据和 350k 行,这需要大量时间来加载。所以想得到你的专家建议。另外,如果我将表列拆分为三个表,并将员工 ID 作为一个公共字段,这会有所帮助吗?会不会让它更快,这可以通过 bulk_create 来实现。请指教..再次感谢您的建议。
    • @KarthikViz:这个帖子已经有五年多了。虽然确实可以更快地做到这一点,但它不会那么重要。这个想法是每个查询可以轻松插入数千条记录,从而实现显着的加速。 ORM 处理可能并不那么重要,尤其是在过去五年中,ORM 得到了改进,而且 ORM 还使构造查询更加安全。
    • 有道理.. 我刚刚尝试了您共享的代码,它现在可以正常工作,没有任何错误,但是只花了将近 5 分钟来处理 50 条记录。 :(
    • 您认为将 120 列拆分为多个表会加快处理速度吗?请指教。
    • @KarthikViz:你确定你批量处理记录吗?看起来您在列表理解中使用了Model.objects.create(..)。尝试记录 SQL 查询。
    猜你喜欢
    • 2013-04-24
    • 2018-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-15
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    相关资源
    最近更新 更多