在Django中須要向數據庫中插入多條數據(list)。使用以下方法,每次save()的時候都會訪問一次數據庫。致使性能問題:python
for i in resultlist: p = Account(name=i) p.save()
在django1.4之後加入了新的特性。使用django.db.models.query.QuerySet.bulk_create()
批量建立對象,減小SQL查詢次數。改進以下:git
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!')
使用批量導入:django
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 循環會更快!!app
#!/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()
,以前文章中也提到過,有就獲取過來,沒有就建立,用它能夠避免重複,可是速度能夠會慢些,由於要先嚐試獲取,看看有沒有spa
只要把上面的:code
Blog.objects.create(title=title,content=content)
換成下面的就不會重複導入數據了orm
Blog.objects.get_or_create(title=title,content=content)
返回值是(BlogObject, True/False)
新建時返回 True, 已經存在時返回 False。