Como sei se posso desativar o SQLALCHEMY_TRACK_MODIFICATIONS?

136

Sempre que executo meu aplicativo que usa Flask-SQLAlchemy, recebo o seguinte aviso de que a SQLALCHEMY_TRACK_MODIFICATIONSopção será desativada.

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

Tentei descobrir o que essa opção faz, mas a documentação do Flask-SQLAlchemy não está clara sobre o que usa esse rastreamento.

SQLALCHEMY_TRACK_MODIFICATIONS

Se definido como True (o padrão), o Flask-SQLAlchemy rastreará modificações de objetos e emitirá sinais. Isso requer memória extra e pode ser desativado se não for necessário.

Como descubro se meu projeto exige SQLALCHEMY_TRACK_MODIFICATIONS = Trueou se posso desativar com segurança esse recurso e economizar memória no meu servidor?

Robert
fonte

Respostas:

175

Provavelmente, seu aplicativo não usa o sistema de eventos Flask-SQLAlchemy, portanto você provavelmente está seguro para desativar. Você precisará auditar o código para verificar. Você está procurando algo que se encaixe models_committedoubefore_models_committed . Se você achar que está usando o sistema de eventos Flask-SQLAlchemy, provavelmente deverá atualizar o código para usar o sistema de eventos interno do SQLAlchemy.

Para desligar o sistema de eventos Flask-SQLAlchemy (e desativar o aviso), basta adicionar:

SQLALCHEMY_TRACK_MODIFICATIONS = False

à configuração do seu aplicativo até que o padrão seja alterado (provavelmente no Flask-SQLAlchemy v3).


Plano de fundo - eis o que o aviso está dizendo:

O Flask-SQLAlchemy possui seu próprio sistema de notificação de eventos que é colocado sobre o SQLAlchemy. Para fazer isso, ele controla as modificações na sessão SQLAlchemy. Isso requer recursos extras; portanto, a opção SQLALCHEMY_TRACK_MODIFICATIONSpermite desativar o sistema de rastreamento de modificações. Atualmente, a opção padrão é True, mas no futuro, esse padrão será alterado para False, desativando o sistema de eventos.

Pelo que entendi, a lógica da mudança é tripla:

  1. Muitas pessoas não usam o sistema de eventos do Flask-SQLAlchemy, mas muitas pessoas não percebem que podem economizar recursos do sistema desativando-o. Portanto, um padrão mais prudente é desativá-lo e quem quiser pode ativá-lo.

  2. O sistema de eventos no Flask-SQLAlchemy tem sido bastante complicado (consulte os problemas vinculados à solicitação de solicitação mencionada abaixo), exigindo manutenção adicional para um recurso que poucas pessoas usam.

  3. Na v0.7, o próprio SQLAlchemy adicionou um poderoso sistema de eventos, incluindo a capacidade de criar eventos personalizados. Idealmente, o sistema de eventos Flask-SQLAlchemy não deve fazer nada além de criar alguns ganchos e ouvintes personalizados de eventos SQLAlchemy e, em seguida, deixar o próprio SQLAlchemy gerenciar o acionador de eventos.

Você pode ver mais na discussão sobre a solicitação pull que começou a acionar esse aviso .

Jeff Widman
fonte
1
OK, estamos chegando perto, mas ainda falta o passo importante em direção a uma resposta real: Que chamada de função / método indica que esse sistema de eventos é usado?
Robert
1
Atualizada a resposta para listar os eventos específicos nos quais qualquer código provavelmente se ligaria ... se você responder a eles e nada aparecer, provavelmente estará seguro.
precisa
12
Para o registro, a variável real que você deseja definir como Verdadeiro ou Falso para evitar essa impressão é app.config['SQLALCHEMY_TRACK_MODIFICATIONS']: onde app é seu aplicativo de balão criado usandoflask.Flask()
Michael Hewson
3
Em geral, isso é verdade; no entanto, se você estiver configurando usando um padrão ou arquivo de objeto, pode ser um pouco diferente ( flask.pocoo.org/docs/latest/config ). Mas se você estiver fazendo isso, provavelmente já sabe como configurar variáveis ​​no seu aplicativo.
precisa saber é o seguinte
72

A explicação detalhada de Jeff Widman é simplesmente perfeita.

Desde que eu tive algumas brigas de copiar e colar antes de acertar, eu gostaria de facilitar para a próxima que estará no meu lugar.

No seu código, imediatamente após :

app = Flask(__name__)

Se você deseja ativar as modificações de faixa, basta adicionar:

app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True

Caso contrário, se você não estiver usando esse recurso, convém alterar o valor para False para não desperdiçar recursos do sistema. Isso ainda silenciará o aviso, pois você estará definindo explicitamente a configuração.

Aqui está o mesmo trecho com valor False:

app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

Agradecemos a Jeff Widman por esta sugestão e detalhes adicionais.

Pitto
fonte
2
Isso é apenas se você realmente deseja ativar as modificações de faixa. Se você não o estiver usando, altere para um Falsepara não desperdiçar recursos do sistema. Isso ainda silenciará o aviso, pois você ainda definirá explicitamente a configuração.
precisa
@ Pitto é isso que eu estava procurando. Na verdade, o sistema de eventos SQLAlchemy está presente na maior parte dele. Adicionais no Flask-SQLAlchemy nunca foram usados. Apenas usando para um aplicativo de amostra. Parabéns à equipe para criar um aviso de descontinuação. Realmente util. app.config ['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
Doogle
7

As respostas acima parecem boas. No entanto, eu queria apontar essa linha na documentação do Flask-SQLAlchemy porque ainda estava recebendo esses avisos depois de definir SQLALCHEMY_TRACK_MODIFICATIONS = Falsena configuração do aplicativo.

Nesta página: http://flask-sqlalchemy.pocoo.org/2.3/config/

Os seguintes valores de configuração existem para Flask-SQLAlchemy. O Flask-SQLAlchemy carrega esses valores da sua configuração principal do Flask, que pode ser preenchida de várias maneiras. Observe que alguns deles não podem ser modificados após a criação do mecanismo, portanto, configure-o o mais cedo possível e não modifique-os em tempo de execução.

Em outras palavras, certifique-se de configurar o seu app.config antes de criar seu banco de dados Flask-SQLAlchemy.

Por exemplo, se você estiver configurando seu aplicativo para definir SQLALCHEMY_TRACK_MODIFICATIONS = False:

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

db = SQLAlchemy(app)
jasonrhaas
fonte