Rumah > pembangunan bahagian belakang > Tutorial Python > Petua pengoptimuman ORM dalam rangka kerja Django

Petua pengoptimuman ORM dalam rangka kerja Django

PHPz
Lepaskan: 2023-06-17 11:57:58
asal
1258 orang telah melayarinya

Sebagai rangka kerja Web Python yang popular, fungsi ORM (Pemetaan Perkaitan Objek) Django telah digunakan secara meluas dalam pembangunan Web, membenarkan pembangun menggunakan objek Python tanpa mengendalikan pangkalan data secara langsung. Walau bagaimanapun, apabila volum data bertambah, prestasi ORM mungkin terjejas. Oleh itu, dalam artikel ini, kami akan memperkenalkan beberapa petua pengoptimuman Django ORM untuk meningkatkan prestasi aplikasi anda.

  1. Gunakan .select_related()

Kaedah .select_related() dalam Django ORM boleh pramuat data semua objek berkaitan, sekali gus mengelakkan berbilang pertanyaan ke pangkalan data . Secara lalai, apabila menanyakan pangkalan data menggunakan ORM, Django hanya mengambil data daripada model utama. Jika model mempunyai satu atau lebih kunci asing, kita boleh mendapatkan semua objek kunci asing melalui .select_related(). Contohnya,

books = Book.objects.select_related('publisher').all()
Salin selepas log masuk

Dalam kod di atas, model Buku mempunyai penerbit kunci asing Dengan memilih model penerbit yang berkaitan, kami boleh mendapatkan semua data berkaitan dalam satu pertanyaan. Ini mengelakkan akses berulang kepada pangkalan data dalam pertanyaan seterusnya dan meningkatkan prestasi.

  1. Gunakan .prefetch_related()

Serupa dengan .select_related(), kaedah .prefetch_related() juga boleh pramuat data model yang ditentukan ke dalam memori untuk Elakkan berbilang pertanyaan pangkalan data. Perbezaannya ialah kaedah .prefetch_related() digunakan untuk akses antara banyak-ke-banyak, perkaitan terbalik dan model lain, contohnya:

publishers = Publisher.objects.prefetch_related('books').all()
Salin selepas log masuk

Dalam kod di atas, model Penerbit mempunyai buku perkaitan terbalik , menggunakan .prefetch_related () boleh mendapatkan semua penerbit sekaligus, mengelakkan overhed berbilang pertanyaan pangkalan data.

  1. Gunakan .values() dan .values_list()

Kaedah .values() dan .values_list() dalam Django ORM boleh digunakan untuk mengumpul data bagi model yang ditentukan ke dalam senarai, dengan itu mengurangkan bilangan pertanyaan pangkalan data. Sebagai contoh,

authors = Author.objects.all().values('name', 'email')
Salin selepas log masuk

Dalam kod di atas, kita hanya perlu mendapatkan nama pengarang dan e-mel, serta menggunakan kaedah .values() untuk mendapatkan keputusan sekali gus.

  1. Gantikan pertanyaan gelung

Dalam Django ORM, kaedah mendapatkan berbilang data melalui pertanyaan gelung mungkin menyebabkan kesesakan prestasi. Sebagai contoh, kod berikut akan menyebabkan banyak pertanyaan pangkalan data:

for author in Author.objects.all():
    books = author.books.all()
    # do something with the books
Salin selepas log masuk

Sebaliknya, kita boleh menggunakan kaedah .prefetch_related() untuk menggantikan pertanyaan gelung untuk mengurangkan pertanyaan pangkalan data:

authors = Author.objects.prefetch_related('books')
for author in authors:
    # get books from prefetched related
    books = author.books.all()
    # do something with the books
Salin selepas log masuk

Dalam perkara di atas kod, kami menggunakan kaedah .prefetch_related() untuk pramuat data pengarang buku untuk mengurangkan bilangan akses pangkalan data.

  1. Menggunakan indeks pangkalan data

Django ORM menyokong penggunaan indeks pangkalan data untuk mempercepatkan pertanyaan. Indeks boleh mengisih data dalam pangkalan data mengikut lajur yang ditentukan, menjadikan proses pertanyaan lebih cekap. Dalam Django, kita boleh menggunakan kelas Meta model untuk mentakrifkan indeks, contohnya:

class Book(models.Model):
    title = models.CharField(max_length=100)
    author = models.ForeignKey(Author, on_delete=models.CASCADE)

    class Meta:
        indexes = [
            models.Index(fields=['title'], name='title_index'),
            models.Index(fields=['author'], name='author_index'),
        ]
Salin selepas log masuk

Dalam kod di atas, kami mentakrifkan dua indeks untuk membuat pertanyaan berdasarkan lajur tajuk dan pengarang.

  1. Kolam sambungan pangkalan data

Dalam Django ORM, sambungan pangkalan data ialah sumber yang mahal. Oleh itu, kita boleh menggunakan kumpulan sambungan pangkalan data untuk mengekalkan satu set sambungan untuk mengurangkan overhed sambungan pangkalan data. Untuk aplikasi Django, anda boleh menggunakan modul Django-dbconn-reuse untuk melaksanakan pengumpulan sambungan pangkalan data. Selepas pemasangan, anda hanya perlu menambah kod berikut pada fail settings.py Django untuk mendayakan kumpulan sambungan:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'mydatabase',
        'USER': 'mydatabaseuser',
        'PASSWORD': 'mypassword',
        'HOST': '127.0.0.1',
        'PORT': '3306',
        'OPTIONS': {
            'init_command': "SET sql_mode='STRICT_TRANS_TABLES'",
            'conn_max_age': 60,
            'charset': 'utf8mb4',
            'pool_size': 5
        }
    }
}
Salin selepas log masuk

Dalam kod di atas, kami menggunakan pangkalan data MySQL dan menetapkan saiz kolam sambungan kepada 5 connect.

Kesimpulan

Dalam aplikasi Django, ORM ialah ciri yang sangat berkuasa yang boleh memudahkan proses interaksi antara aplikasi dan pangkalan data. Menggunakan petua dan pengoptimuman di atas untuk meningkatkan prestasi ORM anda boleh membantu kami memanfaatkan ciri berkuasa ini dengan lebih baik untuk meningkatkan prestasi dan kebolehpercayaan aplikasi.

Atas ialah kandungan terperinci Petua pengoptimuman ORM dalam rangka kerja Django. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan