python - ¿Cómo sé si puedo deshabilitar SQLALCHEMY_TRACK_MODIFICATIONS?
plot title python (3)
Cada vez que ejecuto mi aplicación que usa Flask-SQLAlchemy recibo la siguiente advertencia de que la opción
SQLALCHEMY_TRACK_MODIFICATIONS
estará deshabilitada.
/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 True (el valor 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 requiere
SQLALCHEMY_TRACK_MODIFICATIONS = True
o si puedo desactivar esta función de manera segura y guardar memoria en mi servidor?
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 no está utilizando esta función, es posible que desee cambiar el valor a Falso para no desperdiciar 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.
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 = False
en la configuración de mi 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 pueden 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 establecer
SQLALCHEMY_TRACK_MODIFICATIONS = False
:
from flask import Flask
app = Flask(__name__)
app.config[''SQLALCHEMY_TRACK_MODIFICATIONS''] = False
db = SQLAlchemy(app)
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
models_committed
a
models_committed
o
before_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
SQLALCHEMY_TRACK_MODIFICATIONS
permite 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:
-
No muchas personas usan 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 sensato es deshabilitarlo y aquellos que lo deseen pueden activarlo.
-
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.
-
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 administre el evento desencadenante.
Puede ver más en la discusión sobre la solicitud de extracción que comenzó a activar esta advertencia .