मुझे कैसे पता चलेगा कि मैं SQLALCHEMY_TRACK_MODIFICATIONS को अक्षम कर सकता हूं?


136

हर बार जब मैं अपना ऐप चलाता हूं जो फ्लास्क-एसक्यूएलचेमी का उपयोग करता है तो मुझे निम्नलिखित चेतावनी मिलती है कि SQLALCHEMY_TRACK_MODIFICATIONSविकल्प अक्षम हो जाएगा।

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

मैंने यह पता लगाने की कोशिश की कि यह विकल्प क्या करता है, लेकिन फ्लास्क-एसक्यूएलकेमी प्रलेखन इस ट्रैकिंग का उपयोग करने के बारे में स्पष्ट नहीं है।

SQLALCHEMY_TRACK_MODIFICATIONS

यदि यह सही (डिफ़ॉल्ट) पर सेट है, फ्लास्क-SQLAlchemy वस्तुओं के संशोधनों को ट्रैक करेगा और संकेतों का उत्सर्जन करेगा। इसके लिए अतिरिक्त मेमोरी की आवश्यकता होती है और जरूरत न होने पर इसे निष्क्रिय किया जा सकता है।

मुझे यह कैसे पता चलेगा कि मेरी परियोजना की आवश्यकता है SQLALCHEMY_TRACK_MODIFICATIONS = Trueया यदि मैं इस सुविधा को सुरक्षित रूप से अक्षम कर सकता हूं और अपने सर्वर पर मेमोरी को बचा सकता हूं?

जवाबों:


175

सबसे अधिक संभावना है कि आपका एप्लिकेशन फ्लास्क-SQLAlchemy ईवेंट सिस्टम का उपयोग नहीं करता है, इसलिए आप संभवतः बंद करने के लिए सुरक्षित हैं। आपको सत्यापित करने के लिए कोड की ऑडिट करने की आवश्यकता होगी - आप ऐसी किसी भी चीज़ की तलाश कर रहे हैं जिसमें हुक हो models_committedयाbefore_models_committed । यदि आप पाते हैं कि आप फ्लास्क-एसक्यूएलकेमी ईवेंट सिस्टम का उपयोग कर रहे हैं, तो आपको संभवतः SQLAlchemy के अंतर्निहित ईवेंट सिस्टम का उपयोग करने के लिए कोड को अपडेट करना चाहिए।

फ्लास्क-SQLAlchemy ईवेंट सिस्टम को बंद करने के लिए (और चेतावनी को अक्षम करें), बस जोड़ें:

SQLALCHEMY_TRACK_MODIFICATIONS = False

जब तक डिफ़ॉल्ट परिवर्तित नहीं किया जाता है, तब तक आपके एप्लिकेशन को कॉन्फ़िगर किया जाता है (फ्लास्क-SQLAlchemy v3 में सबसे अधिक संभावना)।


पृष्ठभूमि - यहाँ चेतावनी आपको क्या बता रही है:

फ्लास्क-SQLAlchemy की अपनी घटना सूचना प्रणाली है जो SQLAlchemy के शीर्ष पर स्तरित हो जाती है। ऐसा करने के लिए, यह SQLAlchemy सत्र में संशोधनों को ट्रैक करता है। यह अतिरिक्त संसाधन लेता है, इसलिए विकल्प SQLALCHEMY_TRACK_MODIFICATIONSआपको संशोधन ट्रैकिंग सिस्टम को अक्षम करने की अनुमति देता है। वर्तमान में यह विकल्प डिफॉल्ट करता है True, लेकिन भविष्य में, यह डिफ़ॉल्ट में बदल जाएगा False, जिससे ईवेंट सिस्टम अक्षम हो जाएगा।

जहां तक ​​मैं समझता हूं, परिवर्तन के लिए तर्क तीन गुना है:

  1. बहुत से लोग फ्लास्क-SQLAlchemy के ईवेंट सिस्टम का उपयोग नहीं करते हैं, लेकिन अधिकांश लोगों को यह एहसास नहीं है कि वे सिस्टम संसाधनों को अक्षम करके बचा सकते हैं। तो एक डिफ़ॉल्ट डिफ़ॉल्ट इसे अक्षम करना है और जो इसे चाहते हैं वे इसे चालू कर सकते हैं।

  2. फ्लास्क-एसक्यूएलकेमी में घटना प्रणाली बल्कि छोटी गाड़ी है (नीचे उल्लिखित पुल अनुरोध में जुड़े मुद्दों को देखें), एक सुविधा के लिए अतिरिक्त रखरखाव की आवश्यकता होती है जिसे कुछ लोग उपयोग करते हैं।

  3. V0.7 में, SQLAlchemy ने स्वयं एक शक्तिशाली ईवेंट सिस्टम जोड़ा, जिसमें कस्टम ईवेंट बनाने की क्षमता भी शामिल थी। आदर्श रूप से, फ्लास्क-SQLAlchemy ईवेंट सिस्टम को कुछ कस्टम SQLAlchemy ईवेंट हुक और श्रोताओं को बनाने से अधिक कुछ नहीं करना चाहिए, और फिर SQLAlchemy स्वयं ईवेंट ट्रिगर प्रबंधित करें।

आप इस अनुरोध के चारों ओर चर्चा में अधिक देख सकते हैं जिसने इस चेतावनी को ट्रिगर करना शुरू कर दिया है


1
ठीक है, हम पास हो रहे हैं, लेकिन एक वास्तविक उत्तर की ओर महत्वपूर्ण कदम अभी भी गायब है: क्या फ़ंक्शन / विधि कॉल इंगित करता है कि यह ईवेंट सिस्टम उपयोग किया जाता है?
रॉबर्ट

1
उन विशिष्ट घटनाओं को सूचीबद्ध करने के लिए उत्तर दें, जो किसी भी कोड को हुक करने की संभावना होगी ... यदि आप उन पर grep करते हैं और कुछ भी नहीं आता है, तो आप शायद सुरक्षित हैं।
जेफ विडमैन

12
रिकॉर्ड के लिए, इस प्रिंटआउट से बचने के लिए आप जिस वास्तविक वेरिएबल को ट्रू या फाल्स पर सेट करना चाहते हैं app.config['SQLALCHEMY_TRACK_MODIFICATIONS'], वह ऐप है, जहाँ ऐप आपके फ्लास्क ऐप का उपयोग करके बनाया गया हैflask.Flask()
माइकल ह्युसन

3
सामान्य तौर पर यह सच है; हालाँकि, यदि आप ऑब्जेक्ट पैटर्न या फ़ाइल का उपयोग करके कॉन्फ़िगर कर रहे हैं, तो यह थोड़ा अलग हो सकता है ( flask.pocoo.org/docs/latest/config )। लेकिन अगर आप ऐसा कर रहे हैं, तो आप शायद पहले से ही जानते हैं कि अपने ऐप में वेरिएबल को कैसे कॉन्फ़िगर करें।
जेफ विडमैन

72

जेफ विडमैन की विस्तृत व्याख्या बस एकदम सही है।

चूँकि मेरे पास यह अधिकार प्राप्त करने से पहले कुछ copy'n'paste झगड़े थे, इसलिए मैं इसे अगले एक के लिए आसान बनाना चाहूंगा जो मेरे जूते में होगा।

आपके कोड में, तुरंत बाद :

app = Flask(__name__)

यदि आप ट्रैक संशोधनों को बस जोड़ना चाहते हैं:

app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True

अन्यथा, यदि आप इस सुविधा का उपयोग नहीं कर रहे हैं, तो आप सिस्टम संसाधनों को बर्बाद न करने के लिए मूल्य को गलत में बदलना चाह सकते हैं। यह अभी भी चेतावनी को चुप कर देगा क्योंकि आप वैसे भी स्पष्ट रूप से कॉन्फ़िगरेशन सेट कर रहे हैं।

यहाँ गलत मूल्य के साथ एक ही स्निपेट है:

app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

इस जोड़े गए सुझाव और विवरण के लिए जेफ विडमैन का धन्यवाद।


2
यह केवल तभी है जब आप वास्तव में ट्रैक संशोधनों को सक्षम करना चाहते हैं। यदि आप इसका उपयोग नहीं कर रहे हैं, तो आप इसे बदलना चाहते हैं Falseताकि आप सिस्टम संसाधनों को बर्बाद न करें। यह अभी भी चेतावनी को चुप कर देगा क्योंकि आप अभी भी स्पष्ट रूप से कॉन्फ़िगरेशन सेट कर रहे हैं।
जेफ विडमैन

@ पिट्टो यह वही है जिसे मैं ढूंढ रहा था। वास्तव में SQLAlchemy ईवेंट सिस्टम इसके अधिकांश भाग के लिए हाजिर है। फ्लास्क-SQLAlchemy पर अतिरिक्त कभी इस्तेमाल नहीं किया है। सिर्फ एक सैंपल ऐप के लिए इस्तेमाल कर रहे हैं। कुदोस ने टीम को डेप्रिसिएशन चेतावनी बनाने के लिए। वास्तव में सहायक है। app.config ['SQLALCHEMY_TRACK_MODIFICATIONS'] = गलत
Doogle

7

उपरोक्त उत्तर अच्छे लगते हैं। हालाँकि, मैं इस लाइन को फ्लास्क-SQLAlchemy डॉक्यूमेंटेशन में इंगित करना चाहता था क्योंकि मुझे SQLALCHEMY_TRACK_MODIFICATIONS = Falseअपने एप्लिकेशन कॉन्फ़िगरेशन में सेटिंग के बाद भी ये चेतावनी मिल रही थी ।

इस पेज पर: http://flask-sqlalchemy.pocoo.org/2.3/config/

फ्लास्क-SQLAlchemy के लिए निम्न कॉन्फ़िगरेशन मान मौजूद हैं। फ्लास्क-एसक्यूएलकेमी इन मूल्यों को आपके मुख्य फ्लास्क कॉन्फिग से लोड करता है जिसे विभिन्न तरीकों से पॉप्युलेट किया जा सकता है। ध्यान दें कि इंजन बनने के बाद उनमें से कुछ को संशोधित नहीं किया जा सकता है, इसलिए जितना जल्दी हो सके कॉन्फ़िगर करना सुनिश्चित करें और रनटाइम पर उन्हें संशोधित न करें।

दूसरे शब्दों में, अपने फ्लास्क-SQLAlchemy डेटाबेस को बनाने app.config से पहले इसे स्थापित करना सुनिश्चित करें।

उदाहरण के लिए, यदि आप सेट करने के लिए अपने आवेदन को कॉन्फ़िगर कर रहे हैं SQLALCHEMY_TRACK_MODIFICATIONS = False:

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

db = SQLAlchemy(app)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.