SQLALCHEMY_TRACK_MODIFICATIONS'ı devre dışı bırakıp bırakamayacağımı nasıl anlayabilirim?


136

Flask-SQLAlchemy kullanan uygulamamı her çalıştırdığımda, SQLALCHEMY_TRACK_MODIFICATIONSseçeneğin devre dışı bırakılacağı konusunda aşağıdaki uyarıyı alıyorum .

/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.')

Bu seçeneğin ne yaptığını bulmaya çalıştım, ancak Flask-SQLAlchemy belgeleri bu izlemeyi kullanan şey hakkında net değil.

SQLALCHEMY_TRACK_MODIFICATIONS

True (varsayılan) olarak ayarlanırsa, Flask-SQLAlchemy nesnelerin değişikliklerini izler ve sinyal yayar. Bu, ek bellek gerektirir ve gerekmediğinde devre dışı bırakılabilir.

Projemin gerektirip gerektirmediğini SQLALCHEMY_TRACK_MODIFICATIONS = Trueveya bu özelliği güvenle devre dışı bırakıp sunucumda bellek tasarrufu yapıp yapamayacağımı nasıl öğrenebilirim ?

Yanıtlar:


175

Büyük olasılıkla uygulamanız Flask-SQLAlchemy olay sistemini kullanmaz, bu nedenle muhtemelen kapanabilirsiniz. Doğrulamak için kodu denetlemeniz gerekir - models_committedveyabefore_models_committed içine giren herhangi bir şey arıyorsunuz . Flask-SQLAlchemy olay sistemini kullandığınızı fark ederseniz, muhtemelen kodu SQLAlchemy'nin yerleşik olay sistemini kullanacak şekilde güncellemelisiniz.

Flask-SQLAlchemy olay sistemini kapatmak (ve uyarıyı devre dışı bırakmak) için şunları eklemeniz yeterlidir:

SQLALCHEMY_TRACK_MODIFICATIONS = False

büyük olasılıkla Flask-SQLAlchemy v3'te uygulama yapılandırmanıza ekleyin.


Arka plan - uyarının size söylediği şey:

Flask-SQLAlchemy, SQLAlchemy'nin üzerine katmanlanan kendi olay bildirim sistemine sahiptir. Bunu yapmak için SQLAlchemy oturumundaki değişiklikleri izler. Bu ekstra kaynaklar gerektirir, bu nedenle SQLALCHEMY_TRACK_MODIFICATIONSdeğişiklik izleme sistemini devre dışı bırakmanıza izin verir. Şu anda seçenek varsayılan olarak ayarlanmıştır True, ancak gelecekte bu varsayılan değer olarak değişecek ve Falseböylece olay sistemi devre dışı bırakılacaktır.

Anladığım kadarıyla, değişimin mantığı üç katlıdır:

  1. Birçok kişi Flask-SQLAlchemy'nin olay sistemini kullanmaz, ancak çoğu insan sistem kaynaklarını devre dışı bırakarak kurtarabileceklerinin farkında değildir. Bu yüzden daha akılcı bir varsayılan, onu devre dışı bırakmaktır ve isteyenler onu açabilir.

  2. Flask-SQLAlchemy'deki olay sistemi oldukça hatalıydı (aşağıda belirtilen çekme isteğiyle bağlantılı sorunlara bakın), az kişinin kullandığı bir özellik için ek bakım gerektiriyor.

  3. V0.7'de SQLAlchemy'nin kendisi, özel etkinlikler oluşturma becerisini içeren güçlü bir etkinlik sistemi ekledi . İdeal olarak, Flask-SQLAlchemy olay sistemi, birkaç özel SQLAlchemy olay kancası ve dinleyicisi oluşturmaktan başka bir şey yapmamalı ve daha sonra SQLAlchemy'nin olay tetikleyicisini yönetmesine izin vermelidir.

Bu uyarıyı tetiklemeye başlayan çekme isteği hakkındaki tartışmada daha fazlasını görebilirsiniz .


1
Tamam, yaklaşıyoruz, ancak gerçek bir cevaba doğru atılan önemli adım hala eksik: Hangi fonksiyon / yöntem çağrısı bu olay sisteminin kullanıldığını gösteriyor?
Robert

1
Herhangi bir kodun girebileceği belirli olayları listelemek için cevabı güncelledi ... bunlarda grep ve hiçbir şey gelmezse, muhtemelen güvende.
Jeff Widman

12
Kayıt için, bu çıktıdan kaçınmak için Doğru veya Yanlış olarak ayarlamak istediğiniz gerçek değişken app.config['SQLALCHEMY_TRACK_MODIFICATIONS'], uygulamanın kullanarak balon uygulamanızın oluşturulduğu yerdirflask.Flask()
Michael Hewson

3
Genel olarak bu doğrudur; ancak bir nesne deseni veya dosya kullanarak yapılandırıyorsanız, biraz farklı olabilir ( flask.pocoo.org/docs/latest/config ). Ancak bunu yapıyorsanız, muhtemelen uygulamanızdaki değişkenleri nasıl yapılandıracağınızı zaten biliyorsunuzdur.
Jeff Widman

72

Jeff Widman'ın ayrıntılı açıklaması tek kelimeyle mükemmel.

Bu hakka kavuşmadan önce bazı taklit savaşları yaptığımdan, bir sonraki adımın ayakkabılarımda olmasını kolaylaştırmak istiyorum.

Kodunuzda, hemen sonra :

app = Flask(__name__)

Parça değişikliklerini etkinleştirmek istiyorsanız şunu ekleyin:

app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True

Eğer Aksi halde, değil bu özelliği kullanarak, sistem kaynaklarını israf etmemek için false değerini değiştirmek isteyebilirsiniz. Yine de yapılandırmayı açıkça ayarladığınız için, uyarı yine de susturulur.

Yanlış değerle aynı snippet:

app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

Bu ek öneri ve ayrıntılar için Jeff Widman'a teşekkürler.


2
Bu yalnızca parça değişikliklerini gerçekten etkinleştirmek istiyorsanız geçerlidir. FalseKullanmıyorsanız, sistem kaynaklarını boşa harcamamanız için bunu değiştirmek istersiniz . Yapılandırmayı açıkça ayarladığınız için, bu uyarı hala susturulur.
Jeff Widman

@ Pitto aradığım şey buydu. Gerçekten de SQLAlchemy olay sistemi bunun büyük bir kısmı için yerinde. Flask-SQLAlchemy'de ek olarak hiç kullanılmamış. Sadece örnek bir uygulama için kullanarak. Deplasman uyarısı oluşturmak için takıma şükredin. Gerçekten yardımcı. App.config [ 'SQLALCHEMY_TRACK_MODIFICATIONS'] yanlış =
Doogle'sa

7

Yukarıdaki cevaplar iyi görünüyor. Ancak, Flask-SQLAlchemy belgelerinde bu satırı belirtmek istedim çünkü SQLALCHEMY_TRACK_MODIFICATIONS = Falseuygulama yapılandırmamda ayarladıktan sonra hala bu uyarıları alıyordum .

Bu sayfada: http://flask-sqlalchemy.pocoo.org/2.3/config/

Flask-SQLAlchemy için aşağıdaki yapılandırma değerleri vardır. Flask-SQLAlchemy, bu değerleri çeşitli şekillerde doldurulabilen ana Flask yapılandırmanızdan yükler. Bunlardan bazılarının motor oluşturulduktan sonra değiştirilemeyeceğini unutmayın, bu nedenle mümkün olduğunca erken yapılandırdığınızdan ve çalışma zamanında değiştirmediğinizden emin olun.

Başka bir deyişle, Flask-SQLAlchemy veritabanınızı oluşturmadan app.config önce ayarladığınızdan emin olun .

Örneğin, uygulamanızı ayarlanacak şekilde yapılandırıyorsanız SQLALCHEMY_TRACK_MODIFICATIONS = False:

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

db = SQLAlchemy(app)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.