2015-11-16 12 views
75

Mỗi khi tôi chạy ứng dụng sử dụng Flask-SQLAlchemy, tôi nhận được cảnh báo sau rằng tùy chọn SQLALCHEMY_TRACK_MODIFICATIONS sẽ bị tắt.Làm cách nào để biết liệu tôi có thể tắt SQLALCHEMY_TRACK_MODIFICATIONS không?

/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 ra tùy chọn này, 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 thiết lập là True (mặc định) Flask-SQLAlchemy sẽ theo dõi những thay đổ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 = True hoặ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?

Trả lời

103

Rất có thể ứ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 phải kiểm tra mã để xác minh - bạn đang tìm kiếm bất kỳ thứ gì móc vào models_committed or before_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 của SQLAlchemy thay thế.

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

SQLALCHEMY_TRACK_MODIFICATIONS = False 

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


Background - đây là những gì các cảnh báo được nói cho bạn:

Flask-SQLAlchemy có hệ thống thông báo sự kiện riêng của mình mà được lớp trên đầu trang của 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ó thêm tài nguyên, do đó, tùy chọn SQLALCHEMY_TRACK_MODIFICATIONS cho 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 như tôi hiểu, lý do cho sự thay đổi là ba lần:

  1. Không có nhiều người sử dụng hệ thống sự kiện Flask-SQLAlchemy, nhưng hầu hết mọi người không nhận ra họ có thể tiết kiệm tài nguyên hệ thống bằng 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ó lên.

  2. Hệ thống sự kiện trong Flask-SQLAlchemy khá là lỗi (xem các vấn đề liên quan đến 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, SQLAlchemy tự thêm powerful event system bao gồm khả năng tạo sự kiện tùy chỉnh. Lý tưởng nhất, hệ thống sự kiện Flask-SQLAlchemy không nên làm gì hơn là tạo ra một vài sự kiện và các trình lắng nghe sự kiện SQLAlchemy tùy chỉnh, và sau đó để cho SQLAlchemy tự quản lý trình kích hoạt sự kiện.

Bạn có thể xem thêm trong cuộc thảo luận xung quanh the pull request that started triggering this warning.

+1

OK, chúng tôi đang nhận được gần, nhưng bước quan trọng hướng tới một câu trả lời thực sự là vẫn còn thiếu: chức năng gì/gọi phương thức chỉ ra rằng điều này hệ thống sự kiện được sử dụng? – Robert

+0

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ể sẽ móc vào ... nếu bạn grep vào những thứ đó và không có gì xuất hiện, bạn có thể an toàn. –

+6

Đối với bản ghi, biến thực tế bạn muốn đặt thành True hoặc False để tránh bản in này là '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ụng 'flask.Flask()' –

29

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ố trận đánh copy'n'paste trước khi nhận được quyền này, tôi muốn làm cho nó dễ dàng hơn cho người tiếp theo sẽ có trong đôi giày của tôi.

Trong code của bạn, sau:

app = Flask(__name__) 

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

app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True 

Ngược lại, nếu bạn là không sử dụng tính năng này, bạn có thể muốn thay đổi giá trị thành False để 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 định cấu hình rõ ràng cấu hình.

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

app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False 

Nhờ Jeff Widman cho điều này thêm gợi ý và chi tiết.

+2

Điều này chỉ xảy ra nếu bạn thực sự muốn bật sửa đổi bản nhạc. 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 thiết lập rõ ràng cấu hình. –

+0

Phát ngay, @JeffWidman! Đã thêm chi tiết :) – Pitto

3

Các câu trả lời ở trên trông 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 sau khi thiết lập cấu hình ứng dụng SQLALCHEMY_TRACK_MODIFICATIONS = False.

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

Các giá trị cấu hình sau đây 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 động cơ được tạo ra để đảm bảo định 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, hãy chắc chắn để thiết lập cơ sở dữ liệu tạo Flask-SQLAlchemy bạn app.configtrước của bạn.

Ví dụ, nếu bạn đang cấu hình ứng dụng của bạn để thiết lập SQLALCHEMY_TRACK_MODIFICATIONS = False:

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

db = SQLAlchemy(app) 
Các vấn đề liên quan