Flask y SQLAlchemy, aplicación no registrada en la instancia

Actualmente estoy tratando de armar una pequeña aplicación Frask. Esta es mi estructura.

run.py application __init__.py database.py models.py views.py 

database.py contiene solo el objeto SQLAlchemy:

 db = SQLAlchemy() 

Luego importo esto en mi models.py para crear mis modelos. Por último, dentro de __init__.py importo db de database.py y hago:

 from .database import db from flask import Flask app = Flask(__name__) app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///application.db' db.init_app(app) db.create_all() 

Sin embargo, no puedo crear las tablas a partir de los modelos que aparecen. Si db.create_all() . La aplicación se ejecutará sin problemas, pero obviamente la base de datos no se crea. Cuando db.create_all() está presente, aparece el mensaje “RuntimeError: aplicación no registrada en la instancia de db y ninguna aplicación vinculada al contexto actual”.

Honestamente estoy confundido, ya que antes tenía problemas al iniciar la aplicación sin crear la base de datos, pero mover db a su propio archivo parece haber corregido ese problema. Ahora, el único problema que queda es crear la base de datos.

¿Alguien puede decirme cuál podría ser el problema? Estoy realmente perplejo.

La respuesta está aquí: http://flask-sqlalchemy.pocoo.org/latest/api/#configuration

Vea la parte sobre:

La diferencia entre los dos es que en el primer caso los métodos como create_all () y drop_all () funcionarán todo el tiempo, pero en el segundo caso debe existir un flask.Flask.request_context ().

Hay más información aquí: http://flask-sqlalchemy.pocoo.org/latest/contexts/

Si todo esto es confuso (probablemente lo sea, ya que se trata de una característica bastante avanzada de Flask), la versión corta es db.init_app(app) cambia el objeto de la app , pero no cambia nada en el objeto db . Está a propósito porque puede haber más de una app volando, y db podría tener que hablar con todas ellas. (Dije que era una característica avanzada).

Entonces, cuando llama a db.create_all() sin tener una solicitud en vivo (lo que crea un global que tiene la app actualmente en ejecución), no sabe a qué conectarse y las bombas. Eso es lo que significa el error.

En tu caso, pondría la llamada de SQLAlchemy en __init__.py y le pasaría la app , esa es la forma más fácil:

 db = SQLAlchemy(app) 

O mantenga las cosas como están y ejecute la configuración antes de la primera solicitud:

 @app.before_first_request def create_database(): db.create_all() 

¡Espero que eso ayude! Déjame saber si te encuentras con más problemas.