【问题标题】:Cannot import name 'db' (flask, sqlalchemy) [duplicate]无法导入名称'db'(flask,sqlalchemy)[重复]
【发布时间】:2019-06-09 20:46:32
【问题描述】:

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

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

聊天.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'

由于我是烧瓶(和网络)的新手,我不知道该怎么做。我试过this solution(有点接近我的情况)和所有类似的答案,但它没有用。 我可以尝试什么?

【问题讨论】:

    标签: python flask import sqlalchemy


    【解决方案1】:

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

    您可以创建 Flask-SQLAlchemy db 插件对象 传入 app 参数,并在工厂中使用 .init_app() 方法将该对象连接到 Flask 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 在模块中作为全局变量可用,因此可以在其他地方导入。

    【讨论】:

    • 好吧,我遇到了另一个问题。 “找不到应用程序。在视图函数中工作或推送”当我尝试 db.create_app() 时。所以我按照文档中的建议使用“with app.app_context()”来完成它,但现在我无法导入类。我收到“ImportError: cannot import name 'User'”
    • @elephantsdadshusband:这些都是新的、独立的问题。您可以将这些作为新问题发布。
    • @elephantsdadshusband:换一种说法:我无法在这里解决这些问题,我没有足够的信息,也不应该改变这个问题来添加这些细节。 这个特定问题已经解决,对未来有同样问题的访问者很有用(这就是 SO 的全部意义所在)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-10
    • 2019-12-19
    • 1970-01-01
    相关资源
    最近更新 更多