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.
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()
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.
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()
Dalam kod di atas, model Penerbit mempunyai buku perkaitan terbalik , menggunakan .prefetch_related () boleh mendapatkan semua penerbit sekaligus, mengelakkan overhed berbilang pertanyaan pangkalan data.
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')
Dalam kod di atas, kita hanya perlu mendapatkan nama pengarang dan e-mel, serta menggunakan kaedah .values() untuk mendapatkan keputusan sekali gus.
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
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
Dalam perkara di atas kod, kami menggunakan kaedah .prefetch_related() untuk pramuat data pengarang buku untuk mengurangkan bilangan akses 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'), ]
Dalam kod di atas, kami mentakrifkan dua indeks untuk membuat pertanyaan berdasarkan lajur tajuk dan pengarang.
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 } } }
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!