flask – blueprint – sqlalchemy – no puede importar el nombre ‘db’ al archivo moles

Soy nuevo en bluprint y tengo problemas con la importación de db al archivo mydatabase.py que es el archivo de modelos.

Me he enfrentado a este error:

ImportError: no se puede importar el nombre ‘db’

El arbol de mi proyecto

nikoofar/ run.py bookshelf/ __init__.py mydatabase.py main/ controllers.py __init__.py 

run.py

 from bookshelf import app if __name__ == '__main__': app.run(debug=True, port=8000) 

estantería / intit .py

 from flask import Flask from bookshelf.main.controllers import main from flask_sqlalchemy import SQLAlchemy from mydatabase import pmenu app = Flask(__name__, instance_relative_config=True) db = SQLAlchemy(app) db.init_app(app) application.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://username:password@localhost/databasename' app.config.from_object('config') app.register_blueprint(main, url_prefix='/') 

estantería / main / controllers.py

 from flask import Blueprint from bookshelf.mydatabase import * from flask_sqlalchemy import SQLAlchemy main = Blueprint('main', __name__) @main.route('/') def index(): g = pmenu.query.all() print (g) return "ok" 

El problema se remonta a la base de datos from bookshelf import db , y si lo elimino, el error cambiará a:

ImportError: no se puede importar el nombre ‘db’

estantería / mydatabase.py

 from bookshelf import db class pmenu(db.Model): __tablename__ = 'p_menu' id = db.Column(db.Integer, primary_key=True) txt = db.Column(db.String(80), unique=True) link = db.Column(db.String(1024)) def __init__(self, txt, link): self.txt = txt self.link = link def __repr__(self): return "{'txt': " + self.txt + ", 'link':" + self.link + "}" 

¿Alguna solución?

Esto es realmente un problema simple, pero frustrante. El problema es que está importando main BEFORE crear la instancia de db en su __init__.py

Si mueve la importación después de su db = SQLAlchemy(app) , funcionará:

 from flask import Flask from flask_sqlalchemy import SQLAlchemy app = Flask(__name__) app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://uername:password@localhost/test' db = SQLAlchemy(app) from bookshelf.main.controllers import main #<--move this here app.register_blueprint(main, url_prefix='/')