ฉันจะทราบได้อย่างไรว่าฉันสามารถปิดใช้งาน SQLALCHEMY_TRACK_MODIFICATIONS ได้หรือไม่


147

ทุกครั้งที่ฉันเรียกใช้แอปที่ใช้ Flask-SQLAlchemy ฉันจะได้รับคำเตือนต่อไปนี้ว่า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.')

ฉันพยายามค้นหาว่าตัวเลือกนี้ทำอะไรได้บ้าง แต่เอกสารของ Flask-SQLAlchemy ไม่ชัดเจนเกี่ยวกับสิ่งที่ใช้การติดตามนี้

SQLALCHEMY_TRACK_MODIFICATIONS

หากตั้งค่าเป็น True (ค่าเริ่มต้น) Flask-SQLAlchemy จะติดตามการปรับเปลี่ยนวัตถุและปล่อยสัญญาณ สิ่งนี้ต้องใช้หน่วยความจำเพิ่มเติมและสามารถปิดใช้งานได้หากไม่ต้องการ

ฉันจะทราบได้อย่างไรว่าโครงการของฉันต้องการSQLALCHEMY_TRACK_MODIFICATIONS = Trueหรือสามารถปิดการใช้งานคุณสมบัตินี้อย่างปลอดภัยและบันทึกหน่วยความจำบนเซิร์ฟเวอร์ของฉันได้อย่างไร

คำตอบ:


185

เป็นไปได้มากว่าแอปพลิเคชันของคุณไม่ได้ใช้ระบบเหตุการณ์ Flask-SQLAlchemy ดังนั้นคุณจึงสามารถปิดได้อย่างปลอดภัย คุณจะต้องตรวจสอบรหัสการตรวจสอบ - ด้วยคุณมองหาอะไรที่ตะขอเข้าหรือmodels_committed before_models_committedหากคุณพบว่าคุณกำลังใช้ระบบเหตุการณ์ Flask-SQLAlchemy คุณอาจต้องอัปเดตโค้ดเพื่อใช้ระบบเหตุการณ์ในตัวของ SQLAlchemy แทน

หากต้องการปิดระบบเหตุการณ์ Flask-SQLAlchemy (และปิดการใช้งานคำเตือน) เพียงเพิ่ม:

SQLALCHEMY_TRACK_MODIFICATIONS = False

ไปที่การกำหนดค่าแอปของคุณจนกว่าค่าเริ่มต้นจะเปลี่ยนไป (ส่วนใหญ่จะอยู่ใน Flask-SQLAlchemy v3)


ความเป็นมา - นี่คือสิ่งที่คำเตือนบอกคุณ:

Flask-SQLAlchemy มีระบบการแจ้งเตือนเหตุการณ์ของตัวเองที่วางอยู่บน SQLAlchemy ในการทำเช่นนี้จะติดตามการปรับเปลี่ยนเซสชัน SQLAlchemy การดำเนินการนี้ต้องใช้ทรัพยากรมากขึ้นดังนั้นตัวเลือกนี้จึงSQLALCHEMY_TRACK_MODIFICATIONSอนุญาตให้คุณปิดใช้งานระบบติดตามการแก้ไข ขณะนี้ตัวเลือกมีค่าเริ่มต้นเป็นTrueแต่ในอนาคตค่าเริ่มต้นนั้นจะเปลี่ยนเป็นFalseดังนั้นจึงปิดใช้งานระบบเหตุการณ์

เท่าที่ฉันเข้าใจเหตุผลของการเปลี่ยนแปลงคือสามเท่า:

  1. มีคนจำนวนไม่น้อยที่ใช้ระบบเหตุการณ์ของ Flask-SQLAlchemy แต่คนส่วนใหญ่ไม่ทราบว่าสามารถประหยัดทรัพยากรระบบได้โดยการปิดใช้งาน ดังนั้นค่าเริ่มต้นของ saner คือปิดการใช้งานและผู้ที่ต้องการสามารถเปิดใช้งานได้

  2. ระบบเหตุการณ์ใน Flask-SQLAlchemy ค่อนข้างมีปัญหา (ดูปัญหาที่เชื่อมโยงกับคำขอดึงข้อมูลที่ระบุไว้ด้านล่าง) ซึ่งต้องมีการบำรุงรักษาเพิ่มเติมสำหรับคุณลักษณะที่มีคนใช้เพียงไม่กี่คน

  3. ใน v0.7 นั้น SQLAlchemy ได้เพิ่มระบบเหตุการณ์ที่มีประสิทธิภาพรวมถึงความสามารถในการสร้างเหตุการณ์ที่กำหนดเอง ตามหลักการแล้วระบบเหตุการณ์ Flask-SQLAlchemy ไม่ควรทำอะไรมากไปกว่าสร้าง hooks และตัวฟังเหตุการณ์ SQLAlchemy แบบกำหนดเองสองสามตัวจากนั้นปล่อยให้ SQLAlchemy จัดการทริกเกอร์เหตุการณ์เอง

คุณสามารถดูเพิ่มเติมได้ในการอภิปรายเกี่ยวกับคำขอดึงที่เริ่มทริกเกอร์คำเตือนนี้


1
ตกลงเราใกล้เข้ามาแล้ว แต่ขั้นตอนสำคัญในการหาคำตอบที่แท้จริงยังขาดหายไป: การเรียกใช้ฟังก์ชัน / วิธีการใดที่ระบุว่าใช้ระบบเหตุการณ์นี้
Robert

1
อัปเดตคำตอบเพื่อแสดงรายการเหตุการณ์เฉพาะที่โค้ดใด ๆ น่าจะเชื่อมโยงเข้ามา ... ถ้าคุณ grep กับสิ่งเหล่านั้นและไม่มีอะไรเกิดขึ้นคุณอาจปลอดภัย
Jeff Widman

14
สำหรับการบันทึกตัวแปรจริงที่คุณต้องการตั้งค่าเป็น True หรือ False เพื่อหลีกเลี่ยงการพิมพ์นี้คือapp.config['SQLALCHEMY_TRACK_MODIFICATIONS']แอปที่เป็นแอปขวดของคุณที่สร้างขึ้นโดยใช้flask.Flask()
Michael Hewson

3
โดยทั่วไปนั่นเป็นความจริง อย่างไรก็ตามหากคุณกำลังกำหนดค่าโดยใช้รูปแบบวัตถุหรือไฟล์อาจแตกต่างกันเล็กน้อย ( flask.pocoo.org/docs/latest/config ) แต่ถ้าคุณทำเช่นนั้นคุณอาจรู้วิธีกำหนดค่าตัวแปรในแอปของคุณแล้ว
Jeff Widman

80

คำอธิบายโดยละเอียดของ Jeff Widman นั้นสมบูรณ์แบบ

เนื่องจากฉันมีการต่อสู้แบบ copy'n'paste ก่อนที่จะได้รับสิทธิ์นี้ฉันจึงต้องการทำให้ง่ายขึ้นสำหรับสิ่งต่อไปที่จะอยู่ในรองเท้าของฉัน

ในรหัสของคุณทันทีหลังจาก :

app = Flask(__name__)

หากคุณต้องการเปิดใช้งานการปรับเปลี่ยนแทร็กเพียงเพิ่ม:

app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True

มิฉะนั้นหากคุณไม่ได้ใช้คุณสมบัตินี้คุณอาจต้องการเปลี่ยนค่าเป็น False เพื่อไม่ให้ทรัพยากรระบบสิ้นเปลือง การดำเนินการนี้จะยังคงปิดเสียงเตือนเนื่องจากคุณกำลังตั้งค่าการกำหนดค่าอย่างชัดเจน

นี่คือตัวอย่างข้อมูลเดียวกันที่มีค่าเท็จ:

app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

ขอบคุณ Jeff Widman สำหรับคำแนะนำและรายละเอียดเพิ่มเติมนี้


2
นี่เป็นกรณีที่คุณต้องการเปิดใช้งานการปรับเปลี่ยนแทร็กเท่านั้น หากคุณไม่ได้ใช้งานคุณต้องการเปลี่ยนเป็นFalseเพื่อไม่ให้เสียทรัพยากรระบบ การดำเนินการนี้จะยังคงปิดเสียงเตือนเนื่องจากคุณยังคงตั้งค่าการกำหนดค่าอย่างชัดเจน
Jeff Widman

@Pitto นี่คือสิ่งที่ฉันกำลังมองหา แน่นอนระบบเหตุการณ์ SQLAlchemy เป็นจุดที่ส่วนใหญ่ของมัน ไม่เคยใช้เพิ่มเติมใน Flask-SQLAlchemy เพียงใช้สำหรับแอปตัวอย่าง ขอชื่นชมทีมเพื่อสร้างคำเตือนการเลิกใช้งาน เป็นประโยชน์จริงๆ app.config ['SQLALCHEMY_TRACK_MODIFICATIONS'] = เท็จ
Doogle

8

คำตอบข้างต้นดูดี อย่างไรก็ตามฉันต้องการชี้ให้เห็นบรรทัดนี้ในเอกสาร Flask-SQLAlchemy เพราะฉันยังคงได้รับคำเตือนเหล่านี้หลังจากตั้งค่าSQLALCHEMY_TRACK_MODIFICATIONS = Falseในการกำหนดค่าแอปพลิเคชันของฉัน

ในหน้านี้: http://flask-sqlalchemy.pocoo.org/2.3/config/

มีค่าคอนฟิกูเรชันต่อไปนี้สำหรับ Flask-SQLAlchemy Flask-SQLAlchemy โหลดค่าเหล่านี้จากการกำหนดค่า Flask หลักของคุณซึ่งสามารถเติมได้หลายวิธี โปรดทราบว่าบางส่วนไม่สามารถแก้ไขได้หลังจากสร้างเอ็นจิ้นแล้วดังนั้นโปรดกำหนดค่าให้เร็วที่สุดและห้ามแก้ไขขณะรันไทม์

กล่าวอีกนัยหนึ่งคืออย่าลืมตั้งค่าapp.config ก่อนสร้างฐานข้อมูล Flask-SQLAlchemy

ตัวอย่างเช่นหากคุณกำลังกำหนดค่าแอปพลิเคชันของคุณให้ตั้งค่าSQLALCHEMY_TRACK_MODIFICATIONS = False:

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

db = SQLAlchemy(app)

0

อย่าลืมตั้งค่าคุณสมบัติการกำหนดค่าแอปของคุณก่อนที่คุณจะส่งแอปไปยัง SqlAlchemy ด้านล่างนี้คือตัวอย่างการตั้งค่าการเชื่อมต่อกับเซิร์ฟเวอร์ 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)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.