ジャンゴでデータベースに複数のデータ(リスト)を挿入する必要があります。アクセスが保存されますたびに()データベースで、次のメソッドを使用します。パフォーマンスの問題を引き起こします。
for i in resultlist:
p = Account(name=i)
p.save()
django1.4後に新機能を追加。使用django.db.models.query.QuerySet.bulk_create()
バッチオブジェクトは、SQLクエリの数を減らすために作成されます。次のような改善は、以下のとおりです。
querysetlist=[]
for i in resultlist:
querysetlist.append(Account(name=i))
Account.objects.bulk_create(querysetlist)
Model.objects.bulk_create()より速く、より便利に
一般的な使用方法:
#coding:utf-8
import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings")
'''
Django 版本大于等于1.7的时候,需要加上下面两句
import django
django.setup()
否则会抛出错误 django.core.exceptions.AppRegistryNotReady: Models aren't loaded yet.
'''
import django
if django.VERSION >= (1, 7):#自动判断版本
django.setup()
def main():
from blog.models import Blog
f = open('oldblog.txt')
for line in f:
title,content = line.split('****')
Blog.objects.create(title=title,content=content)
f.close()
if __name__ == "__main__":
main()
print('Done!')
使用一括インポート:
import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings")
def main():
from blog.models import Blog
f = open('oldblog.txt')
BlogList = []
for line in f:
title,content = line.split('****')
blog = Blog(title=title,content=content)
BlogList.append(blog)
f.close()
Blog.objects.bulk_create(BlogList)
if __name__ == "__main__":
main()
print('Done!')
そのためBlog.objects.create()
、すべての後、SQLの実装を保存し、bulk_create()
より速くそんなに、SQLに格納されたデータの複数の実装!もちろん、forループの代わりに、リスト内包して高速になります!!
#!/usr/bin/env python
import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings")
def main():
from blog.models import Blog
f = open('oldblog.txt')
BlogList = []
for line in f:
parts = line.split('****')
BlogList.append(Blog(title=parts[0], content=parts[1]))
f.close()
# 以上四行 也可以用 列表解析 写成下面这样
# BlogList = [Blog(title=line.split('****')[0], content=line.split('****')[1]) for line in f]
Blog.objects.bulk_create(BlogList)
if __name__ == "__main__":
main()
print('Done!')
例えば:
# 获取数量
nums = request.POST.get('nums').strip()
if nums.isdigit() and int(nums) > 0:
# 方法一
# for i in range(int(nums)):
# device = Device(
# category=category,
# seat=seat_obj,
# asset_code='',
# asset_num='V{}-{}'.format(category.name, str(i).zfill(4)), # V类型-0001编号
# use_info='',
# operator=operator,
# op_type=1
# )
# device.save() # 每次save()的时候都会访问一次数据库。导致性能问题
# 方法二
device_obj_list = []
for i in range(int(nums)):
device_obj_list.append(
Device(
category=category,
seat=seat_obj,
asset_code='---',
asset_num='{}-xxxx'.format(category.name), # 类型-xxxx
use_info='---',
operator=operator,
op_type=1
)
)
Device.objects.bulk_create(device_obj_list) # 使用django.db.models.query.QuerySet.bulk_create()批量创建对象,减少SQL查询次数
messages.info(request, '批量添加{}条数据完成!'.format(nums))
一括インポートデータは、ソリューションを繰り返し、
あまりにも多くのデータをインポートする場合は、手動でインポート一部を停止した場合、輸入間違っている、または、一部がインポートされません。それとも、あなたが重複したデータを見つけるだろう、再び上記のコマンドを実行し、どのようにそれを行うには?
django.db.models
そこと呼ばれる機能もあるget_or_create()
がどうかを確認するために取得する最初の試みので、また前述の記事の前には、乗り越える必要があり、作成されていない、重複を避けるためにそれを使用しますが、速度が遅くなります
長い上記のように:
Blog.objects.create(title=title,content=content)
インポートされた繰り返しデータ以下の置き換えられません
Blog.objects.get_or_create(title=title,content=content)
戻り値がされ(BlogObject, True/False)
、既に存在する場合ときに、新しいtrueを返しますFalseを返さ。