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


136

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

답변:


175

대부분의 응용 프로그램에서 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 자체가 이벤트 트리거를 관리하도록하는 것 이상을 수행하지 않아야합니다.

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


1
우리는 점점 가까워지고 있지만, 실제 답변을 향한 중요한 단계는 여전히 빠졌습니다.이 이벤트 시스템이 사용되었다는 기능 / 방법 호출은 무엇입니까?
Robert

1
모든 코드가 연결될 수있는 특정 이벤트를 나열하도록 답변을 업데이트했습니다. 그러면 아무것도 얻지 못하면 안전 할 것입니다.
Jeff Widman 10

12
공식적으로, 실제 변수 당신은 참으로 설정할이 출력은 피하기 위해 거짓 app.config['SQLALCHEMY_TRACK_MODIFICATIONS']앱이 플라스크 응용 프로그램이 사용하여 만든이고,flask.Flask()
마이클 휴슨

3
일반적으로 그것은 사실입니다. 그러나 객체 패턴 또는 파일을 사용하여 구성하는 경우 약간 다를 수 있습니다 ( flask.pocoo.org/docs/latest/config ). 그러나 그렇게하고 있다면 앱에서 변수를 구성하는 방법을 이미 알고있을 것입니다.
Jeff Widman 2016 년

72

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

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

코드에서 바로 다음 :

app = Flask(__name__)

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

app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True

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

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

app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

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


2
실제로 트랙 수정을 활성화하려는 경우에만 해당됩니다. 사용 False하지 않는 경우 시스템 리소스를 낭비하지 않도록 변경하고 싶습니다 . 구성을 명시 적으로 설정하고 있기 때문에 여전히 경고가 표시되지 않습니다.
Jeff Widman

@Pitto 이것이 내가 찾던 것입니다. 실제로 SQLAlchemy 이벤트 시스템은 대부분의 시스템에서 사용됩니다. Flask-SQLAlchemy에 대한 추가 기능은 사용하지 않았습니다. 샘플 앱에만 사용하십시오. 지원 중단 경고를 작성하라는 팀의 의견. 정말 도움이됩니다. app.config [ 'SQLALCHEMY_TRACK_MODIFICATIONS'] = False
Doogle

7

위의 답변이 좋아 보입니다. 그러나 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)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.