Python 如何将json数据加载到表django

Python 如何将json数据加载到表django,python,sql,django,oracle,Python,Sql,Django,Oracle,我创建了一个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):

我创建了一个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批插入轻松完成

具体参考下述章节:

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")
SQL批插入通过构建单个SQL,我们可以做得更好 INSERT语句一次创建多个记录,类似于 由批量生成的SQL\u创建:

导入UTIL

从上下文库导入关闭

从django.db导入连接从django.utils导入时区

def sql_批量插入(n_记录): sql='INSERT INTO app_testmodel(字段_1、字段_2、字段_3)值{}'。格式( “,”。联接(['(%s,%s,%s)]*n_记录), ) 参数=[] 对于X范围内的i(0,n_记录): params.extend([i,str(i),timezone.now()]))

如果name='main': timed(sql\u batch\u insert)手动构建sql查询会给代码添加比使用bulk\u create更大的噪音,但除此之外 没有明显的缺点:

$python sql_batch_insert.py在167ms内创建了10000条记录 性能与bulk_create和 我们在比较标准ORM create()方法和简单的 SQL INSERT语句,ORM开销非常大

然而,我对编程和django是新手,因此我无法理解如何转换现有代码以使用它来更快地处理数据并成批加载

请注意:我还尝试使用django bulk_create,因为我得到了大约300k的数据记录,并且得到了一个错误,称为“唯一约束冲突”

请任何专家帮助我,并指导我如何将其转换为sql批处理插入,以更快地将数据加载到我的数据库

非常感谢。

您可以使用在同一查询中创建所有对象:

def加载数据(请求):
如果request.method==“POST”:
url='apiurl'
response=requests.get(url,stream=True)
data=response.json()
记录=[
模型(
emp=data.get('emp',None),
name=data.get('emp',无)。get('name',无)
)
对于数据中的项
]
Model.objects.bulk\u创建(记录)
返回渲染(请求'main.html')

因此,我们首先列出
Model
对象(尚未保存到数据库),然后调用
Model.objects.bulk\u create(…)
立即保存所有这些元素。

谢谢Willem。只是好奇在我的帖子的url中提到的时间。与批量创建/ORM相比,SQl批处理显示更少的处理时间。你能告诉我情况是否如此吗?我有将近120列数据和350k行,这需要花费很多时间来加载。所以我想得到你的专家建议。另外,如果我将表列拆分为三个表,并将employee id作为公共字段,会有帮助吗?这会使它更快吗?这可以通过批量创建来实现。请告知。。再次感谢您的建议。@KarthikViz:这篇文章已经有五年多的历史了。虽然可能确实可以更快地完成,但不会有那么大的意义。其思想是,每个查询可以轻松插入数千条记录,从而实现显著的加速。ORM处理可能没有那么重要,特别是在过去五年中,ORM得到了改进,ORM也使构造查询更加安全。这是有意义的。。我刚刚尝试了您共享的代码,现在可以正常工作,没有任何错误,但仅处理50条记录就花费了近5分钟的时间:(您认为将120列拆分为多个表会加快处理速度吗?请提出建议。@KarthikViz:您确定要批量处理记录吗?看起来您在列表理解中使用了
Model.objects.create(…)
。尝试记录SQL查询。
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')