¿Cómo sé si puedo deshabilitar SQLALCHEMY_TRACK_MODIFICATIONS?


136

Cada vez que ejecuto mi aplicación que usa Flask-SQLAlchemy recibo la siguiente advertencia de que la SQLALCHEMY_TRACK_MODIFICATIONSopción estará desactivada.

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

Traté de averiguar qué hace esta opción, pero la documentación de Flask-SQLAlchemy no es clara sobre qué utiliza este seguimiento.

SQLALCHEMY_TRACK_MODIFICATIONS

Si se establece en Verdadero (predeterminado), Flask-SQLAlchemy rastreará las modificaciones de los objetos y emitirá señales. Esto requiere memoria adicional y se puede desactivar si no es necesario.

¿Cómo puedo saber si mi proyecto lo requiere SQLALCHEMY_TRACK_MODIFICATIONS = Trueo si puedo desactivar esta función de manera segura y guardar memoria en mi servidor?

Respuestas:


175

Lo más probable es que su aplicación no use el sistema de eventos Flask-SQLAlchemy, por lo que probablemente sea seguro apagarlo. Tendrá que auditar el código para verificar: está buscando cualquier cosa que se conecte a models_committedobefore_models_committed . Si encuentra que está utilizando el sistema de eventos Flask-SQLAlchemy, probablemente debería actualizar el código para utilizar el sistema de eventos incorporado de SQLAlchemy.

Para desactivar el sistema de eventos Flask-SQLAlchemy (y deshabilitar la advertencia), simplemente agregue:

SQLALCHEMY_TRACK_MODIFICATIONS = False

a la configuración de su aplicación hasta que se cambie el valor predeterminado (muy probablemente en Flask-SQLAlchemy v3).


Antecedentes: esto es lo que le dice la advertencia:

Flask-SQLAlchemy tiene su propio sistema de notificación de eventos que se superpone a SQLAlchemy. Para hacer esto, rastrea las modificaciones a la sesión SQLAlchemy. Esto requiere recursos adicionales, por lo que la opción le SQLALCHEMY_TRACK_MODIFICATIONSpermite deshabilitar el sistema de seguimiento de modificaciones. Actualmente, la opción predeterminada es True, pero en el futuro, ese valor predeterminado cambiará a False, deshabilitando así el sistema de eventos.

Por lo que yo entiendo, la justificación del cambio es triple:

  1. No mucha gente usa el sistema de eventos de Flask-SQLAlchemy, pero la mayoría de las personas no se dan cuenta de que pueden ahorrar recursos del sistema deshabilitándolo. Entonces, un valor predeterminado más sano es deshabilitarlo y aquellos que lo deseen pueden activarlo.

  2. El sistema de eventos en Flask-SQLAlchemy ha sido bastante defectuoso (vea los problemas vinculados en la solicitud de extracción mencionada a continuación), que requiere mantenimiento adicional para una función que pocas personas usan.

  3. En v0.7, SQLAlchemy mismo agregó un poderoso sistema de eventos que incluye la capacidad de crear eventos personalizados. Idealmente, el sistema de eventos Flask-SQLAlchemy no debería hacer nada más que crear algunos ganchos y escuchas de eventos SQLAlchemy personalizados, y luego dejar que SQLAlchemy mismo administre el desencadenante del evento.

Puede ver más en la discusión sobre la solicitud de extracción que comenzó a activar esta advertencia .


1
OK, nos estamos acercando, pero aún falta el paso importante hacia una respuesta real: ¿Qué función / llamada de método indica que se utiliza este sistema de eventos?
Robert

1
Se actualizó la respuesta para enumerar los eventos específicos en los que probablemente se engancharía cualquier código ... si los utiliza y no aparece nada, probablemente esté a salvo.
Jeff Widman

12
Para el registro, la variable real que desea establecer en Verdadero o Falso para evitar esta impresión es app.config['SQLALCHEMY_TRACK_MODIFICATIONS'], donde la aplicación es su aplicación de matraz creada usandoflask.Flask()
Michael Hewson

3
En general eso es cierto; sin embargo, si está configurando usando un patrón o archivo de objeto, puede ser un poco diferente ( flask.pocoo.org/docs/latest/config ). Pero si está haciendo eso, probablemente ya sepa cómo configurar variables en su aplicación.
Jeff Widman

72

La explicación detallada de Jeff Widman es simplemente perfecta.

Dado que tuve algunas peleas de copiar y pegar antes de hacer esto bien, me gustaría facilitar la próxima pelea.

En su código, inmediatamente después :

app = Flask(__name__)

Si desea habilitar las modificaciones de pista simplemente agregue:

app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True

De lo contrario, si está no utiliza esta característica, es posible que desee cambiar el valor a falso con el fin de no desperdiciar los recursos del sistema. Esto aún silenciará la advertencia ya que de todos modos está configurando explícitamente la configuración.

Aquí está el mismo fragmento con valor falso:

app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

Gracias a Jeff Widman por esta sugerencia y detalles adicionales.


2
Esto es solo si realmente desea habilitar las modificaciones de pista. Si no lo está utilizando, desea cambiarlo por uno Falsepara no desperdiciar recursos del sistema. Esto aún silenciará la advertencia ya que todavía está configurando explícitamente la configuración.
Jeff Widman

@Pitto esto es lo que estaba buscando. De hecho, el sistema de eventos SQLAlchemy es perfecto en su mayor parte. Adicional en Flask-SQLAlchemy nunca se ha utilizado. Solo uso para una aplicación de muestra. Felicitaciones al equipo para crear advertencia de desaprobación. De mucha ayuda. app.config ['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
Doogle

7

Las respuestas anteriores se ven bien. Sin embargo, quería señalar esta línea en la documentación de Flask-SQLAlchemy porque todavía recibía estas advertencias después de configurar SQLALCHEMY_TRACK_MODIFICATIONS = Falsemi configuración de aplicación.

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

Los siguientes valores de configuración existen para Flask-SQLAlchemy. Flask-SQLAlchemy carga estos valores desde su configuración principal de Flask que se puede completar de varias maneras. Tenga en cuenta que algunos de ellos no se pueden modificar después de que se creó el motor, así que asegúrese de configurarlo lo antes posible y no modificarlos en tiempo de ejecución.

En otras palabras, asegúrese de configurar su app.config antes de crear su base de datos Flask-SQLAlchemy.

Por ejemplo, si está configurando su aplicación para configurar SQLALCHEMY_TRACK_MODIFICATIONS = False:

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

db = SQLAlchemy(app)
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.