Bagaimana saya tahu jika saya dapat menonaktifkan SQLALCHEMY_TRACK_MODIFICATIONS?

147

Setiap kali saya menjalankan aplikasi saya yang menggunakan Flask-SQLAlchemy, saya mendapatkan peringatan berikut bahwa SQLALCHEMY_TRACK_MODIFICATIONSopsi tersebut akan dinonaktifkan.

/home/david/.virtualenvs/flask-sqlalchemy/lib/python3.5/site-packages/flask_sqlalchemy/__init__.py:800: UserWarning: SQLALCHEMY_TRACK_MODIFICATIONS adds significant overhead and will be disabled by default in the future.  Set it to True to suppress this warning.
  warnings.warn('SQLALCHEMY_TRACK_MODIFICATIONS adds significant overhead and will be disabled by default in the future.  Set it to True to suppress this warning.')

Saya mencoba mencari tahu apa yang dilakukan opsi ini, tetapi dokumentasi Flask-SQLAlchemy tidak jelas tentang apa yang menggunakan pelacakan ini.

SQLALCHEMY_TRACK_MODIFICATIONS

Jika disetel ke True (default) Flask-SQLAlchemy akan melacak modifikasi objek dan memancarkan sinyal. Ini membutuhkan memori ekstra dan dapat dinonaktifkan jika tidak diperlukan.

Bagaimana cara mengetahui apakah proyek saya memerlukan SQLALCHEMY_TRACK_MODIFICATIONS = Trueatau apakah saya dapat menonaktifkan fitur ini dengan aman dan menghemat memori di server saya?

Robert
sumber

Jawaban:

184

Kemungkinan besar aplikasi Anda tidak menggunakan sistem event Flask-SQLAlchemy, jadi Anda mungkin aman untuk mematikannya. Anda harus mengaudit kode untuk memverifikasi - Anda mencari apa pun yang terkait models_committedataubefore_models_committed . Jika ternyata Anda menggunakan sistem event Flask-SQLAlchemy, Anda mungkin harus memperbarui kode untuk menggunakan sistem event built-in SQLAlchemy.

Untuk mematikan sistem event Flask-SQLAlchemy (dan menonaktifkan peringatan), cukup tambahkan:

SQLALCHEMY_TRACK_MODIFICATIONS = False

ke konfigurasi aplikasi Anda hingga defaultnya diubah (kemungkinan besar di Flask-SQLAlchemy v3).


Latar belakang - inilah peringatan yang memberi tahu Anda:

Flask-SQLAlchemy memiliki sistem pemberitahuan kejadiannya sendiri yang berlapis-lapis di atas SQLAlchemy. Untuk melakukan ini, ia melacak modifikasi pada sesi SQLAlchemy. Ini membutuhkan sumber daya tambahan, jadi dengan opsi ini SQLALCHEMY_TRACK_MODIFICATIONSAnda dapat menonaktifkan sistem pelacakan modifikasi. Saat ini opsi default True, tetapi di masa mendatang, default itu akan berubah menjadi False, sehingga menonaktifkan sistem acara.

Sejauh yang saya pahami, alasan untuk perubahan itu tiga kali lipat:

  1. Tidak banyak orang yang menggunakan sistem event Flask-SQLAlchemy, tetapi kebanyakan orang tidak menyadari bahwa mereka dapat menghemat sumber daya sistem dengan menonaktifkannya. Jadi default yang lebih waras adalah menonaktifkannya dan mereka yang menginginkannya dapat mengaktifkannya.

  2. Sistem event di Flask-SQLAlchemy agak bermasalah (lihat masalah yang terkait dengan pull request yang disebutkan di bawah), membutuhkan pemeliharaan tambahan untuk fitur yang hanya digunakan oleh sedikit orang.

  3. Di v0.7, SQLAlchemy sendiri menambahkan sistem acara yang kuat termasuk kemampuan untuk membuat acara khusus. Idealnya, sistem event Flask-SQLAlchemy tidak lebih dari membuat beberapa event hook dan listener SQLAlchemy kustom, dan kemudian membiarkan SQLAlchemy mengelola event trigger itu sendiri.

Anda dapat melihat lebih banyak dalam diskusi seputar permintaan pull yang mulai memicu peringatan ini .

Jeff Widman
sumber
1
Oke, kita semakin dekat, tetapi langkah penting menuju jawaban sebenarnya masih hilang: Panggilan fungsi / metode apa yang menunjukkan bahwa sistem peristiwa ini digunakan?
Robert
1
Memperbarui jawaban untuk mencantumkan peristiwa spesifik yang kemungkinan besar akan dihubungkan dengan kode apa pun ... jika Anda mengikutinya dan tidak ada yang muncul, Anda mungkin aman.
Jeff Widman
14
Sebagai catatan, variabel sebenarnya yang ingin Anda setel ke True atau False untuk menghindari cetakan ini adalah app.config['SQLALCHEMY_TRACK_MODIFICATIONS'], di mana aplikasi adalah aplikasi labu Anda yang dibuat menggunakanflask.Flask()
Michael Hewson
3
Secara umum itu benar; namun jika Anda mengkonfigurasi menggunakan pola objek atau file, mungkin akan sedikit berbeda ( flask.pocoo.org/docs/latest/config ). Tetapi jika Anda melakukannya, Anda mungkin sudah tahu cara mengonfigurasi variabel di aplikasi Anda.
Jeff Widman
80

Penjelasan rinci Jeff Widman sangat sempurna.

Karena saya memiliki beberapa pertarungan copy'n'paste sebelum mendapatkan hak ini, saya ingin membuatnya lebih mudah untuk yang berikutnya yang akan ada di sepatu saya.

Di kode Anda, segera setelah :

app = Flask(__name__)

Jika Anda ingin mengaktifkan modifikasi trek cukup tambahkan:

app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True

Jika tidak, jika Anda tidak menggunakan fitur ini, Anda mungkin ingin mengubah nilainya menjadi False agar tidak membuang sumber daya sistem. Ini masih akan membungkam peringatan karena Anda tetap secara eksplisit mengatur konfigurasi.

Berikut cuplikan yang sama dengan nilai False:

app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

Terima kasih kepada Jeff Widman untuk saran dan detail tambahan ini.

Pitto
sumber
2
Ini hanya jika Anda benar-benar ingin mengaktifkan modifikasi trek. Jika Anda tidak menggunakannya, Anda ingin mengubahnya menjadi a Falsesehingga Anda tidak membuang sumber daya sistem. Ini masih akan menonaktifkan peringatan karena Anda masih secara eksplisit mengatur konfigurasi.
Jeff Widman
@Pitto inilah yang saya cari. Memang sistem acara SQLAlchemy tepat untuk sebagian besar darinya. Tambahan pada Flask-SQLAlchemy tidak pernah digunakan. Hanya menggunakan untuk aplikasi sampel. Kudos kepada tim untuk membuat peringatan penghentian. Sangat membantu. app.config ['SQLALCHEMY_TRACK_MODIFICATIONS'] = Salah
Doogle
8

Jawaban di atas terlihat bagus. Namun, saya ingin menunjukkan baris ini dalam dokumentasi Flask-SQLAlchemy karena saya masih mendapatkan peringatan ini setelah mengatur SQLALCHEMY_TRACK_MODIFICATIONS = Falsekonfigurasi aplikasi saya.

Di halaman ini: http://flask-sqlalchemy.pocoo.org/2.3/config/

Nilai konfigurasi berikut tersedia untuk Flask-SQLAlchemy. Flask-SQLAlchemy memuat nilai-nilai ini dari konfigurasi Flask utama Anda yang dapat diisi dengan berbagai cara. Perhatikan bahwa beberapa di antaranya tidak dapat diubah setelah mesin dibuat, jadi pastikan untuk mengonfigurasi sedini mungkin dan untuk tidak memodifikasinya saat runtime.

Dengan kata lain, pastikan untuk menyiapkan Anda app.config sebelum membuat database Flask-SQLAlchemy.

Misalnya, jika Anda sedang mengonfigurasi aplikasi Anda untuk disetel SQLALCHEMY_TRACK_MODIFICATIONS = False:

from flask import Flask
app = Flask(__name__)
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

db = SQLAlchemy(app)
jasonrhaas
sumber
0

Pastikan untuk menyetel properti konfigurasi aplikasi Anda SEBELUM Anda meneruskan aplikasi ke SqlAlchemy. Di bawah ini adalah contoh pengaturan koneksi ke server sql.

import os
from flask import Flask
from flask_sqlalchemy import SQLAlchemy

SECRET_KEY = os.urandom(32)
SERVER = 'MY_DB_SERVER'
DATABASE = 'MY_DB_NAME'
USERNAME = 'MY_DOMAIN\\MY_USERNAME'
PASSWORD = '$ecretsSecretsarenofun...' # the office ref iykyk
DRIVER = 'SQL SERVER'
DATABASE_CONNECTION = f'MSSQL://{USERNAME}:{PASSWORD}@{SERVER}/{DATABASE}?driver={DRIVER};trusted_connection=yes'

app = Flask(__name__)

# set your config properties BEFORE passing the app to SQLAlchemy
app.config['SECRET_KEY'] = SECRET_KEY
app.config['SQLALCHEMY_DATABASE_URI'] = DATABASE_CONNECTION
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

db = SQLAlchemy(app)
John Nettles
sumber