Làm cách nào để biết tôi có thể tắt SQLALCHEMY_TRACK_MODIFICATION không?


136

Mỗi lần tôi chạy ứng dụng sử dụng Flask-SQLAlchemy, tôi nhận được cảnh báo sau rằng SQLALCHEMY_TRACK_MODIFICATIONStùy chọn sẽ bị tắt.

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

Tôi đã cố gắng tìm hiểu tùy chọn này làm gì, nhưng tài liệu Flask-SQLAlchemy không rõ ràng về những gì sử dụng theo dõi này.

SQLALCHEMY_TRACK_MODIFICATIONS

Nếu được đặt thành True (mặc định) Flask-SQLAlchemy sẽ theo dõi các sửa đổi của các đối tượng và phát ra tín hiệu. Điều này đòi hỏi thêm bộ nhớ và có thể bị vô hiệu hóa nếu không cần thiết.

Làm cách nào để tìm hiểu xem dự án của tôi có yêu cầu SQLALCHEMY_TRACK_MODIFICATIONS = Truehoặc nếu tôi có thể tắt tính năng này một cách an toàn và tiết kiệm bộ nhớ trên máy chủ của mình không?

Câu trả lời:


175

Nhiều khả năng ứng dụng của bạn không sử dụng hệ thống sự kiện Flask-SQLAlchemy, vì vậy bạn có thể an toàn để tắt. Bạn sẽ cần kiểm tra mã để xác minh - bạn đang tìm kiếm bất cứ thứ gì móc vào models_committedhoặcbefore_models_committed . Nếu bạn thấy rằng bạn đang sử dụng hệ thống sự kiện Flask-SQLAlchemy, có lẽ bạn nên cập nhật mã để sử dụng hệ thống sự kiện tích hợp sẵn của SQLAlchemy.

Để tắt hệ thống sự kiện Flask-SQLAlchemy (và tắt cảnh báo), chỉ cần thêm:

SQLALCHEMY_TRACK_MODIFICATIONS = False

đến cấu hình ứng dụng của bạn cho đến khi mặc định được thay đổi (rất có thể trong Flask-SQLAlchemy v3).


Bối cảnh - đây là những gì cảnh báo đang nói với bạn:

Flask-SQLAlchemy có hệ thống thông báo sự kiện riêng được xếp chồng lên trên SQLAlchemy. Để làm điều này, nó theo dõi các sửa đổi đối với phiên SQLAlchemy. Điều này cần thêm tài nguyên, vì vậy tùy chọn SQLALCHEMY_TRACK_MODIFICATIONScho phép bạn vô hiệu hóa hệ thống theo dõi sửa đổi. Hiện tại tùy chọn mặc định là True, nhưng trong tương lai, mặc định đó sẽ thay đổi thành False, do đó vô hiệu hóa hệ thống sự kiện.

Theo tôi hiểu, lý do cho sự thay đổi là ba lần:

  1. Không nhiều người sử dụng hệ thống sự kiện của Flask-SQLAlchemy, nhưng hầu hết mọi người không nhận ra rằng họ có thể tiết kiệm tài nguyên hệ thống bằng cách vô hiệu hóa nó. Vì vậy, một mặc định saner là vô hiệu hóa nó và những người muốn nó có thể bật nó.

  2. Hệ thống sự kiện trong Flask-SQLAlchemy khá lỗi (xem các sự cố được liên kết trong yêu cầu kéo được đề cập bên dưới), yêu cầu bảo trì bổ sung cho một tính năng mà ít người sử dụng.

  3. Trong v0.7, chính SQLAlchemy đã thêm một hệ thống sự kiện mạnh mẽ bao gồm khả năng tạo các sự kiện tùy chỉnh. Lý tưởng nhất là hệ thống sự kiện Flask-SQLAlchemy không nên làm gì khác hơn là tạo ra một số trình móc và trình nghe sự kiện SQLAlchemy tùy chỉnh, sau đó để chính SQLAlchemy quản lý trình kích hoạt sự kiện.

Bạn có thể thấy nhiều hơn trong các cuộc thảo luận xung quanh yêu cầu kéo bắt đầu kích hoạt cảnh báo này .


1
OK, chúng tôi đang tiến gần hơn, nhưng bước quan trọng đối với một câu trả lời thực sự vẫn còn thiếu: Cuộc gọi chức năng / phương thức nào cho biết hệ thống sự kiện này được sử dụng?
Robert

1
Đã cập nhật câu trả lời để liệt kê các sự kiện cụ thể mà bất kỳ mã nào có thể dính vào ... nếu bạn grep vào những sự kiện đó và không có gì xảy ra, có lẽ bạn an toàn.
Jeff Widman

12
Đối với bản ghi, biến thực tế bạn muốn đặt thành Đúng hoặc Sai để tránh bản in này app.config['SQLALCHEMY_TRACK_MODIFICATIONS'], trong đó ứng dụng là ứng dụng bình của bạn được tạo bằng cách sử dụngflask.Flask()
Michael Hewson

3
Nói chung là đúng; tuy nhiên nếu bạn đang định cấu hình bằng cách sử dụng một mẫu hoặc tệp đối tượng thì nó có thể hơi khác một chút ( Vase.pocoo.org/docs/latest/config ). Nhưng nếu bạn đang làm điều đó, có lẽ bạn đã biết cách định cấu hình các biến trong ứng dụng của mình.
Jeff Widman

72

Giải thích chi tiết của Jeff Widman đơn giản là hoàn hảo.

Vì tôi đã có một số bản sao chiến đấu trước khi có được quyền này, tôi muốn làm cho nó dễ dàng hơn cho cái tiếp theo sẽ ở trong đôi giày của tôi.

Trong mã của bạn, ngay sau :

app = Flask(__name__)

Nếu bạn muốn kích hoạt sửa đổi theo dõi, chỉ cần thêm:

app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True

Mặt khác, nếu bạn không sử dụng tính năng này, bạn có thể muốn thay đổi giá trị thành Sai để không lãng phí tài nguyên hệ thống. Điều này sẽ vẫn im lặng cảnh báo vì dù sao bạn cũng đang thiết lập cấu hình một cách rõ ràng.

Đây là đoạn mã tương tự với giá trị Sai:

app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

Cảm ơn Jeff Widman vì đã thêm gợi ý và chi tiết này.


2
Điều này chỉ khi bạn thực sự muốn kích hoạt sửa đổi theo dõi. Nếu bạn không sử dụng nó, bạn muốn thay đổi nó thành Falseđể bạn không lãng phí tài nguyên hệ thống. Điều này sẽ vẫn im lặng cảnh báo vì bạn vẫn rõ ràng thiết lập cấu hình.
Jeff Widman

@Pitto đây là những gì tôi đang tìm kiếm. Thật vậy, hệ thống sự kiện SQLAlchemy được phát hiện trên hầu hết các phần của nó. Bổ sung trên Flask-SQLAlchemy chưa bao giờ được sử dụng. Chỉ cần sử dụng cho một ứng dụng mẫu. Kudos cho nhóm để tạo cảnh báo khấu hao. Thực sự hữu ích. app.config ['SQLALCHEMY_TRACK_MODIFICATION'] = Sai
Doogle

7

Các câu trả lời trên có vẻ tốt. Tuy nhiên, tôi muốn chỉ ra dòng này trong tài liệu Flask-SQLAlchemy vì tôi vẫn nhận được các cảnh báo này sau khi cài đặt SQLALCHEMY_TRACK_MODIFICATIONS = Falsetrong cấu hình ứng dụng của mình.

Trên trang này: http://flask-sqlalchemy.pocoo.org/2.3/config/

Các giá trị cấu hình sau tồn tại cho Flask-SQLAlchemy. Flask-SQLAlchemy tải các giá trị này từ cấu hình Flask chính của bạn có thể được điền theo nhiều cách khác nhau. Lưu ý rằng một số trong số đó không thể được sửa đổi sau khi công cụ được tạo, vì vậy hãy đảm bảo cấu hình càng sớm càng tốt và không sửa đổi chúng khi chạy.

Nói cách khác, đảm bảo thiết lập app.config trước khi tạo cơ sở dữ liệu Flask-SQLAlchemy của bạn.

Ví dụ: nếu bạn định cấu hình ứng dụng của mình để đặt SQLALCHEMY_TRACK_MODIFICATIONS = False:

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

db = SQLAlchemy(app)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.