[python] SQLALCHEMY_TRACK_MODIFICATIONS를 비활성화 할 수 있는지 어떻게 알 수 있습니까?

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또는이 기능을 안전하게 비활성화하고 서버의 메모리를 절약 할 수 있는지 어떻게 알 수 있습니까?



답변

대부분의 응용 프로그램에서 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의 이벤트 시스템을 사용하는 사람은 많지 않지만 대부분 비활성화하여 시스템 리소스를 절약 할 수 있다는 것을 인식하지 못합니다. 따라서 기본 설정은 사용하지 않도록 설정하는 것이며 원하는 사람은 사용하도록 설정할 수 있습니다.

  2. Flask-SQLAlchemy의 이벤트 시스템은 다소 버그가 많았으며 (아래 언급 된 풀 요청에 링크 된 문제 참조) 소수의 사람들이 사용하는 기능을 추가로 유지 보수해야합니다.

  3. v0.7에서 SQLAlchemy 자체는 사용자 정의 이벤트 작성 기능을 포함한 강력한 이벤트 시스템 을 추가했습니다 . 이상적으로 Flask-SQLAlchemy 이벤트 시스템은 몇 가지 사용자 정의 SQLAlchemy 이벤트 후크 및 리스너를 작성한 다음 SQLAlchemy 자체가 이벤트 트리거를 관리하도록하는 것 이상을 수행하지 않아야합니다.

이 경고를 트리거하기 시작한 풀 요청에 대한 자세한 내용을 볼 수 있습니다 .


답변

Jeff Widman의 자세한 설명은 간단합니다.

이 권리를 얻기 전에 copy’n’paste 싸움을했기 때문에 다음 신발을 더 쉽게 만들고 싶습니다.

코드에서 바로 다음 :

app = Flask(__name__)

트랙 수정을 사용하려면 다음을 추가하십시오.

app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True

그렇지 않으면 이 기능을 사용 하지 않는 경우 시스템 자원을 낭비하지 않기 위해 값을 False로 변경할 수 있습니다. 어쨌든 구성을 명시 적으로 설정하기 때문에 여전히 경고가 표시되지 않습니다.

False 값을 가진 동일한 스 니펫은 다음과 같습니다.

app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

이 제안과 세부 사항에 대해 Jeff Widman에게 감사드립니다.


답변

위의 답변이 좋아 보입니다. 그러나 SQLALCHEMY_TRACK_MODIFICATIONS = False응용 프로그램 구성에서 설정 한 후에도 여전히 경고가 표시되므로 Flask-SQLAlchemy 설명서 에서이 줄을 지적하고 싶었습니다 .

이 페이지에서 : http://flask-sqlalchemy.pocoo.org/2.3/config/

Flask-SQLAlchemy에는 다음 구성 값이 있습니다. Flask-SQLAlchemy는 다양한 방법으로 채울 수있는 기본 Flask 구성에서이 값을로드합니다. 엔진을 생성 한 후에는 이들 중 일부를 수정할 수 없으므로 가능한 한 빨리 구성하고 런타임에 수정하지 마십시오.

즉, Flask-SQLAlchemy 데이터베이스를 만들기 app.config 전에 설정해야합니다 .

예를 들어, 설정하도록 응용 프로그램을 구성하는 경우 SQLALCHEMY_TRACK_MODIFICATIONS = False:

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

db = SQLAlchemy(app)


답변