El flask_sqlalchemy
módulo no tiene que ser inicializado con la aplicación de inmediato - que puede hacer esto en su lugar:
# apps.members.models
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
class Member(db.Model):
# fields here
pass
Y luego, en la configuración de su aplicación, puede llamar a init_app
:
# apps.application.py
from flask import Flask
from apps.members.models import db
app = Flask(__name__)
# later on
db.init_app(app)
De esta forma puede evitar importaciones cíclicas.
Este patrón no requiere que coloques todos tus modelos en un archivo. Simplemente importe la db
variable en cada uno de los módulos de su modelo.
Ejemplo
# apps.shared.models
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
# apps.members.models
from apps.shared.models import db
class Member(db.Model):
# TODO: Implement this.
pass
# apps.reporting.members
from flask import render_template
from apps.members.models import Member
def report_on_members():
# TODO: Actually use arguments
members = Member.filter(1==1).all()
return render_template("report.html", members=members)
# apps.reporting.routes
from flask import Blueprint
from apps.reporting.members import report_on_members
reporting = Blueprint("reporting", __name__)
reporting.route("/member-report", methods=["GET","POST"])(report_on_members)
# apps.application
from flask import Flask
from apps.shared import db
from apps.reporting.routes import reporting
app = Flask(__name__)
db.init_app(app)
app.register_blueprint(reporting)
Nota: este es un esbozo de parte del poder que esto le brinda; obviamente, hay bastante más que puede hacer para facilitar aún más el desarrollo (usando un create_app
patrón, registro automático de planos en ciertas carpetas, etc.)
db
instancia para cada base de datos que tiene. Si tiene un paquete de modelos, puede colocarlo__init__.py
. Independientemente de cómo elija hacerlo, simplemente importe ladb
variable desde esa ubicación a sus otros archivos de modelo y úsela normalmente. Cuando se cargan todo se resuelve correctamente..ext.
espacio de nombres está en desuso; es mejor importar desde el espacio de nombres real (flask_sqlalchemy
).una app.py original : https://flask-sqlalchemy.palletsprojects.com/en/2.x/quickstart/
Acabo de dividir una app.py en app.py y model.py sin usar Blueprint. En ese caso, la respuesta anterior no funciona. Se necesita un código de línea para funcionar.
antes :
despues :
Y el siguiente enlace es muy útil.
http://piotr.banaszkiewicz.org/blog/2012/06/29/flask-sqlalchemy-init_app/
fuente
db.app = app
obtenía runtimeerror porque init_app no configura la aplicación. +1db.app = app
(seguido dedb.init_app(app)
) fue la pieza que me faltaba. Funciona perfectamente después de agregar esa línea (combinado con la respuesta de Sean Vieira)