Django4.0 數(shù)據(jù)庫訪問優(yōu)化-使用批量方法

2022-03-16 18:02 更新

使用批量方法來減少SQL語句

批量創(chuàng)建

當創(chuàng)建對象時,盡可能使用 ?bulk_create()? 方法來減少 SQL 查詢數(shù)量。比如:

Entry.objects.bulk_create([
    Entry(headline='This is a test'),
    Entry(headline='This is only a test'),
])

要優(yōu)于:

Entry.objects.create(headline='This is a test')
Entry.objects.create(headline='This is only a test')

批量更新

當更新對象時,盡可能使用 ?bulk_update()? 方法來減少 SQL 查詢數(shù)。給定對象的列表或查詢集:

entries = Entry.objects.bulk_create([
    Entry(headline='This is a test'),
    Entry(headline='This is only a test'),
])

下面示例:

entries[0].headline = 'This is not a test'
entries[1].headline = 'This is no longer a test'
Entry.objects.bulk_update(entries, ['headline'])

要優(yōu)于:

entries[0].headline = 'This is not a test'
entries[0].save()
entries[1].headline = 'This is no longer a test'
entries[1].save()

批量插入

當插入對象到 ?ManyToManyFields ?時,使用帶有多個對象的 ?add()? 來減少 SQL 查詢的數(shù)量。舉例:

my_band.members.add(me, my_friend)

要優(yōu)于:

my_band.members.add(me)
my_band.members.add(my_friend)

其中 ?Bands ?和 ?Artists ?有多對多關系。
當不同的對象對插入到 ?ManyToManyField ?或者自定義的 ?through ?表被定義時,可以使用 ?bulk_create()? 方法來減少 SQL 查詢的數(shù)量。比如:

PizzaToppingRelationship = Pizza.toppings.through
PizzaToppingRelationship.objects.bulk_create([
    PizzaToppingRelationship(pizza=my_pizza, topping=pepperoni),
    PizzaToppingRelationship(pizza=your_pizza, topping=pepperoni),
    PizzaToppingRelationship(pizza=your_pizza, topping=mushroom),
], ignore_conflicts=True)

要優(yōu)于:

my_pizza.toppings.add(pepperoni)
your_pizza.toppings.add(pepperoni, mushroom)

批量刪除

當從 ?ManyToManyFields ?刪除對象時,可以使用帶有多個對象的 ?remove()? 來減少 SQL 查詢的數(shù)量。比如:

my_band.members.remove(me, my_friend)

要優(yōu)于:

my_band.members.remove(me)
my_band.members.remove(my_friend)

其中 ?Bands ?和 ?Artists ?有多對多關系。
當從 ?ManyToManyFields ?里刪除不同的對象對時,可以在帶有多種 ?through ?模型實例的 ?Q ?表達式上使用 ?delete()? 來減少 SQL 查詢的數(shù)量。比如:

from django.db.models import Q
PizzaToppingRelationship = Pizza.toppings.through
PizzaToppingRelationship.objects.filter(
    Q(pizza=my_pizza, topping=pepperoni) |
    Q(pizza=your_pizza, topping=pepperoni) |
    Q(pizza=your_pizza, topping=mushroom)
).delete()

要優(yōu)于:

my_pizza.toppings.remove(pepperoni)
your_pizza.toppings.remove(pepperoni, mushroom)


以上內容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號