Nplusone adalah perpustakaan untuk mendeteksi masalah kueri N+1 di Python Orms, termasuk Sqlalchemy, Peewee, dan Django ORM.
Banyak pustaka pemetaan objek-relasional (ORM) default untuk memuat malas untuk hubungan. Pola ini bisa efisien ketika baris terkait jarang diakses, tetapi dengan cepat menjadi tidak efisien karena hubungan diakses lebih sering. Dalam kasus ini, memuat baris terkait dengan penuh semangat menggunakan JOIN
bisa jauh lebih banyak kinerja. Sayangnya, memahami kapan harus menggunakan malas versus pemuatan yang bersemangat bisa menantang: Anda mungkin tidak melihat masalahnya sampai aplikasi Anda melambat hingga merangkak.
nplusone
adalah alat profil ORM untuk membantu mendiagnosis dan meningkatkan kinerja yang buruk yang disebabkan oleh pemuatan malas yang tidak pantas. nplusone
memonitor aplikasi menggunakan django atau sqlalchemy dan mengirimkan pemberitahuan ketika malas malas yang berpotensi mahal dipancarkan. Ini dapat mengidentifikasi atribut hubungan yang menyinggung dan baris kode tertentu di balik masalah, dan merekomendasikan perbaikan untuk kinerja yang lebih baik.
nplusone
juga mendeteksi pemuatan yang tidak pantas untuk pemuatan flask-sqlalchemy dan django orm, memancarkan peringatan ketika data terkait dimuat dengan penuh semangat tetapi tidak pernah diakses dalam permintaan saat ini.
Pip Instal -U nplusone
Nplusone mendukung python> = 2.7 atau> = 3.3.
Catatan: nplusone
hanya boleh digunakan untuk pengembangan dan tidak boleh digunakan ke lingkungan produksi.
CATATAN: nplusone
mendukung Django> = 1.8.
Tambahkan nplusone
ke INSTALLED_APPS
:
Installed_apps = ( ... 'nplusone.ext.django', )
Tambahkan NPlusOneMiddleware
:
Middleware = ( 'nplusone.ext.django.nplusonemiddleware', ... )
Secara opsional mengonfigurasi pengaturan logging:
Nplusone_logger = logging.getLogger ('nplusone') Nplusone_log_level = logging.warn
Konfigurasikan penangan logging:
Logging = { 'Versi': 1, 'Handlers': { 'konsol': { 'Class': 'Logging.streamHandler', }, }, 'Loggers': { 'nplusone': { 'Handlers': ['Console'], 'level': 'memperingatkan', }, }, }
Ketika aplikasi Anda memuat data dengan malas, nplusone
akan memancarkan pesan log:
Potensi n+1 kueri terdeteksi pada `<podel>. <idield>`
Pertimbangkan untuk menggunakan select_related atau prefetch_related dalam kasus ini.
Ketika aplikasi Anda dengan bersemangat memuat data terkait tanpa mengaksesnya, nplusone
akan mencatat peringatan:
Potensi beban bersemangat yang tidak perlu terdeteksi pada `<podel>. <idield>`
Bungkus aplikasi dengan NPlusOne
:
Dari Flask Impor Flask dari nplusone.ext.flask_sqlalchemy impor nplusone app = flask (__ name__) Nplusone (aplikasi)
Secara opsional mengonfigurasi pengaturan logging:
app = flask (__ name__) app.config ['nplusone_logger'] = logging.getLogger ('app.nplusone') app.config ['nplusone_log_level'] = logging.error Nplusone (aplikasi)
Ketika aplikasi Anda memuat data dengan malas, nplusone
akan memancarkan pesan log:
Potensi n+1 kueri terdeteksi pada `<podel>. <idield>`
Pertimbangkan untuk menggunakan subqueryload
atau joinedload
dalam kasus ini; Lihat Panduan Sqlalchemy untuk pemuatan hubungan untuk dokumentasi lengkap.
Ketika aplikasi Anda dengan bersemangat memuat data terkait tanpa mengaksesnya, nplusone
akan mencatat peringatan:
Potensi beban bersemangat yang tidak perlu terdeteksi pada `<podel>. <idield>`
Untuk kerangka kerja lain yang mengikuti spesifikasi WSGI, bungkus aplikasi Anda dengan nplusonemiddleware. Anda juga harus mengimpor ekstensi nplusone
yang relevan untuk ORM Anda:
Botol impor dari nplusone.ext.wsgi impor nplusonemiddleware impor nplusone.ext.sqlalchemy app = nplusonemiddleware (botol.app ())
Integrasi di atas digabungkan dengan siklus permintaan-respons. Untuk menggunakan nplusone
di luar konteks permintaan HTTP, gunakan Manajer Konteks Profiler
: Anda juga harus mengimpor ekstensi nplusone
yang relevan untuk ORM Anda:
dari nplusone.core Profiler impor impor nplusone.ext.sqlalchemy dengan profiler.profiler (): ...
Secara default, nplusone
mencatat semua pertanyaan yang berpotensi tidak perlu menggunakan logger bernama "nplusone". Ketika opsi konfigurasi NPLUSONE_RAISE diatur, nplusone
juga akan meningkatkan NPlusOneError
. Ini dapat digunakan untuk memaksa semua tes otomatis yang melibatkan permintaan yang tidak perlu gagal.
# Django Config Nplusone_raise = true # Flask Config app.config ['nplusone_raise'] = true
Jenis pengecualian juga dapat ditentukan, jika diinginkan, menggunakan opsi NPLUSONE_ERROR
.
Untuk mengabaikan pemberitahuan dari nplusone
secara global, konfigurasikan daftar putih menggunakan opsi nplusone_whitelist:
# Django Config Nplusone_whitelist = [ {'Label': 'n_plus_one', 'model': 'myapp.mymodel'} ] # Flask-sqlalchemy config app.config ['nplusone_whitelist'] = [ {'label': 'tidak digunakan_eager_load', 'model': 'mymodel', 'field': 'my_field'} ]
Anda dapat membuat daftar putih model dengan nama yang tepat atau dengan pola fnmatch:
# Django Config Nplusone_whitelist = [ {'model': 'myapp.*'} ]
Untuk menekan pemberitahuan secara lokal, gunakan ignore
context manager:
dari nplusone.core Sinyal impor dengan sinyal.ignore (sinyals.lazy_load): # baris malas-muatan # ...
MIT berlisensi. Lihat file lisensi yang dibundel untuk lebih jelasnya.