无法导入名称“ db”(烧瓶,sqlalchemy)

时间:2019-01-15 19:29:37

标签: python flask import sqlalchemy

我正在尝试导入数据库并收到错误“无法导入名称'db'”。我已经看到了有关此类问题的答案,但对我而言,这些答案都没有帮助。 我的项目树:

chat
  | chat.py
  └─ app
      │   models.py
      │   __init__.py
      │
      ├─── main
      │      events.py
      │      forms.py
      │      routes.py
      │      __init__.py

chat.py:

from app import create_app, socketio

app = create_app(debug=True)

if __name__ == '__main__':
    socketio.run(app)

app \ init.py:

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_socketio import SocketIO

socketio = SocketIO()

def create_app(debug=False):
    app = Flask(__name__)
    app.debug = debug
    app.config['SECRET_KEY'] = 'gjr39dkjn344_!67#'
    app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql:///site.db'
    db = SQLAlchemy(app)
    from .main import main as main_blueprint
    app.register_blueprint(main_blueprint)
    socketio.init_app(app)
    return app 

app \ main \ init.py:

from flask import Blueprint

main = Blueprint('main', __name__)

from . import routes, events 

app \ models.py:

from app import db

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(15), nullable=False)
    session_id = db.Column(db.String(200), nullable=False)
    isready = db.Column(db.Boolean, default='False')
    room = db.relationship('Room', backref='spy')
    def __repr__(self):
        return f"User('{self.username}')"

因此,当我在python终端中尝试from app import db时,我会得到

  

ImportError:无法导入名称“ db”

由于我是不熟悉Flask(和Web的人),所以我不知道该怎么办。我已经尝试过this solution(最接近我的情况),并且都给出了类似的答案,但是没有用。 我可以尝试什么?

1 个答案:

答案 0 :(得分:0)

db只是create_app()函数中的局部变量。您需要在create_app()工厂的外部对象中创建该对象。

您可以创建Flask-SQLAlchemy db插件对象,而无需传入app参数,并在工厂中将该对象连接到Flask app使用.init_app()方法,就像您对Flask-SocketIO插件所做的一样:

db = SQLAlchemy()

def create_app(debug=False):
    app = Flask(__name__)
    app.debug = debug
    app.config['SECRET_KEY'] = 'gjr39dkjn344_!67#'
    app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql:///site.db'

    db.init_app(app)
    socketio.init_app(app)

    from .main import main as main_blueprint
    app.register_blueprint(main_blueprint)

    return app 

现在db在模块中可以作为全局变量使用,因此可以在其他位置导入。