Django bulk_create()、udate()とデータベース事務の効率比較分析
5170 ワード
10000個のオブジェクトを作成する例でテストします。
一、django設定フィールドのダイナミックなデフォルト時間の4つの方法:
modelは初期化するたびに、このフィールドのデフォルト値を初期化時間として自動的に設定します。
2.default=datetime.now
modelは、新規または変更のたびに、自動的にこのフィールドの値を操作時間として設定します。設定後もORMを使って手動でフィールドを変更できます。
3.aut_now_add=True
デフォルトの値はFalseで、Trueに設定すると、modelが新規操作を行うたびに、このフィールドの値を操作時間として自動的に設定します。Trueに設定すると、ORMを使って手動でフィールドを変更できません。フィールドの値を塗りつぶしても上書きされます。
4.aut_now=True
デフォルトの値はFalseです。Trueに設定すると、modelは新規または変更のたびに、このフィールドの値を操作時間として自動的に設定します。Trueに設定すると、ORMを使って手動でフィールドを変更できません。フィールドの値を塗りつぶしても上書きされます。
5.注意すべき点
ダイナミックデフォルト時間をプロジェクトの起動時間として設定したい場合以外は、default=datetime.now()という使い方は間違っています。期待外の結果が得られます。
User.objects.udate方法を使用する場合、設定したdefault=datetime.nowとaut_now=Trueは有効ではありません。now=Trueのフィールドは手動で変更できません。この場合はsave方法でデータを修正するしかありません。これは複数のデータの更新に友好的ではありません。
したがって、ダイナミックデフォルト時間のフィールドを設定すると、default=datetime.nowとaut_を使用するべきです。now_add=Trueで実現します。
二、null=Trueとblank=Trueの違い
1.nullはデータベースに対して、null=Trueなら、データベースを表すこのフィールドは空です。
2.blankはフォームに対して、blank=Trueであれば、フォームがそのフィールドに記入されている場合は記入しないことができます。
mysql中空値は空間を占有しないで、NULLは空間を占有して、しかもNULLを使ってインデックスの効率を下げます。したがって、性能的にはnull=Trueは推奨されませんので、default=''を使用した方がいいです。
三、saveとbuild_createの違い
1.saveの使い方:
一括操作はデータベースと一回だけ相互作用し、効率が高いです。
bulk_createの短所:
自己増加フィールドを設定した場合、戻り値にはこのフィールドの値はありません。上記の例2のuserオブジェクトのように。
動的デフォルト時間が設定されているフィールドに対しては、aut_が設定されている。now=Trueは、同じバッチの記録でこのフィールドの時間は同じです。
四、上の知識点の使用例
1.定義モデル
# for , 37
for i in range(10000):
name="String number %s"%i
Record.objects.create(name=name)
# django , 2.65
@transaction.commit_manually
def manual_transaction():
for i in range(10000):
name="String number %s"%i
Record.objects.create(name=name)
transaction.commit()
# bulk_create , 0.47
def builtin():
insert_list =[]
for i in range(10000):
name="String number %s"%i
insert_list.append(Record(name=name))
Record.objects.bulk_create(insert_list)
# for , 72 :
def auto_transaction():
for record inRecord.objects.all():
record.name ="String without number"
record.save()
# django , 17
@transaction.commit_manually
def manual_transaction():
for record inRecord.objects.all():
record.name ="String without number"
record.save()
transaction.commit()
# update , 0.33
def builtin():
Record.objects.all().update(name="String without number")
補足知識:djangoのモデル使用上、出会いやすいピット、default=datetime.nowとautnow、nullとblank、saveとudate、bulk_create一、django設定フィールドのダイナミックなデフォルト時間の4つの方法:
from django.db import models
from datetime import datetime
class User(models.Model):
id = models.BigAutoField(' ', primary_key=True)
name = models.CharField(' ', max_length=20, db_index=True, default='')
create_time_one = models.DateTimeField(' ', default=datetime.now())
update_time_one = models.DateTimeField(' ', default=datetime.now)
create_time_tow = models.DateTimeField(' ', auto_now_add=True)
update_time_tow = models.DateTimeField(' ', auto_now=True)
1.default=datetime.now()modelは初期化するたびに、このフィールドのデフォルト値を初期化時間として自動的に設定します。
2.default=datetime.now
modelは、新規または変更のたびに、自動的にこのフィールドの値を操作時間として設定します。設定後もORMを使って手動でフィールドを変更できます。
3.aut_now_add=True
デフォルトの値はFalseで、Trueに設定すると、modelが新規操作を行うたびに、このフィールドの値を操作時間として自動的に設定します。Trueに設定すると、ORMを使って手動でフィールドを変更できません。フィールドの値を塗りつぶしても上書きされます。
4.aut_now=True
デフォルトの値はFalseです。Trueに設定すると、modelは新規または変更のたびに、このフィールドの値を操作時間として自動的に設定します。Trueに設定すると、ORMを使って手動でフィールドを変更できません。フィールドの値を塗りつぶしても上書きされます。
5.注意すべき点
ダイナミックデフォルト時間をプロジェクトの起動時間として設定したい場合以外は、default=datetime.now()という使い方は間違っています。期待外の結果が得られます。
User.objects.udate方法を使用する場合、設定したdefault=datetime.nowとaut_now=Trueは有効ではありません。now=Trueのフィールドは手動で変更できません。この場合はsave方法でデータを修正するしかありません。これは複数のデータの更新に友好的ではありません。
したがって、ダイナミックデフォルト時間のフィールドを設定すると、default=datetime.nowとaut_を使用するべきです。now_add=Trueで実現します。
二、null=Trueとblank=Trueの違い
1.nullはデータベースに対して、null=Trueなら、データベースを表すこのフィールドは空です。
2.blankはフォームに対して、blank=Trueであれば、フォームがそのフィールドに記入されている場合は記入しないことができます。
mysql中空値は空間を占有しないで、NULLは空間を占有して、しかもNULLを使ってインデックスの効率を下げます。したがって、性能的にはnull=Trueは推奨されませんので、default=''を使用した方がいいです。
三、saveとbuild_createの違い
1.saveの使い方:
names = [' ', ' ']
for name in names:
user = User(name=name)
user.save()
print(user.id) # user id
2.bulk_を使用するcreate方法:
names = [' ', ' ']
users = [User(name=name) for name in names]
users = User.objects.bulk_create(users)
print([user.id for user in users]) # user id
bulk_createの長所:一括操作はデータベースと一回だけ相互作用し、効率が高いです。
bulk_createの短所:
自己増加フィールドを設定した場合、戻り値にはこのフィールドの値はありません。上記の例2のuserオブジェクトのように。
動的デフォルト時間が設定されているフィールドに対しては、aut_が設定されている。now=Trueは、同じバッチの記録でこのフィールドの時間は同じです。
四、上の知識点の使用例
1.定義モデル
from django.db import models
from datetime import datetime
class User(models.Model):
id = models.BigAutoField(' ', primary_key=True)
name = models.CharField(' ', max_length=20, db_index=True, blank=False, default='')
create_time = models.DateTimeField(' ', auto_now_add=True)
update_time = models.DateTimeField(' ', default=datetime.now)
2.データの挿入
#
names = [' ', ' ']
users = [User(name=name) for name in names]
users = User.objects.bulk_create(users)
#
names = [' ', ' ']
users = [User(name=name) for name in names]
[user.save() for user in users]
3.データの変更
#
names = [' ', ' ']
User.objects.filter(name__in=names).update(name='changed', update_time=datetime.now()) # update_time
#
names = [' ', ' ']
users = User.objects.filter(name__in=names)
for use in users:
user.name = 'changed'
user.save() # update_time, save
以上のこのD jango bulk_create()、udate()とデータベース事務の効率比較分析は、小編集が皆さんに共有しているすべての内容です。参考にしていただければと思います。皆さん、よろしくお願いします。