【问题标题】:Flask, SQLAlchemy, Data Tables - ImportError: cannot import name 'db' in Models.pyFlask,SQLAlchemy,数据表 - ImportError:无法在 Models.py 中导入名称“db”
【发布时间】:2018-10-15 21:02:08
【问题描述】:

我正在尝试将数据表与 Flask 和 SQLAchemy 一起使用,而我正面临着

ImportError: 无法导入名称 'db'

在模块 Models.py 中

我的项目树:

app
    /common
        __init__.py
        models.py
        toutes.py
    /mod_tables
        ---
    __init__
    config.py

__init__.py

    from flask import Flask, redirect, session
    from app.mod_tables.models import TableBuilder
    from app.config import Config
    from flask_sqlalchemy import SQLAlchemy
    #from flask_migrate import Migrate

    app = Flask(__name__)

    table_builder = TableBuilder()

    app.config.from_object(Config)
    db = SQLAlchemy(app)
    db.init_app(app)
    #migrate = Migrate(app, db)

    from app.common.routes import main
    from app.common import models
    from app.mod_tables.controllers import tables

    # Register the different blueprints
    app.register_blueprint(main)
    app.register_blueprint(tables)

config.py

import os

basedir = os.path.abspath(os.path.dirname(__file__))

class Config(object):

    SQLALCHEMY_DATABASE_URI = os.environ.get('DATABASE_URL') or \
        'sqlite:///' + os.path.join(basedir, 'spbData-V3560-FRANCO.db')
    SQLALCHEMY_TRACK_MODIFICATIONS = False

\common.models.py

from app import db

class TipoPoste(db.Model):
    tp_tipo = db.Column(db.String(35), primary_key=True)
    tp_descricao = db.Column(db.String(255))
    def __repr__(self):
        return '<Tipo Poste {} - {}>'.format(self.tp_tipo, 
            self.tp_descricao)

这些代码给了我以下错误:

flask.cli.NoAppException flask.cli.NoAppException: While importing
"app", an ImportError was raised:

Traceback (most recent call last):   File
"c:\users\rfran.v3560-franco\appdata\local\programs\python\python36-32\lib\site-packages\flask\cli.py",
line 235, in locate_app
     __import__(module_name)   File "C:\Users\rfran.V3560-FRANCO\OneDrive\ArquivosLocais\gepoc\app\__init__.py",
line 2, in <module>
    from app.mod_tables.models import TableBuilder   File "C:\Users\rfran.V3560-FRANCO\OneDrive\ArquivosLocais\gepoc\app\mod_tables\models.py",
line 3, in <module>
    from app.common.models import TipoPoste   File "C:\Users\rfran.V3560-FRANCO\OneDrive\ArquivosLocais\gepoc\app\common\models.py",
line 1, in <module>
    from app import db ImportError: cannot import name 'db'

有什么提示吗?提前致谢。

【问题讨论】:

    标签: flask datatables sqlalchemy


    【解决方案1】:

    您的错误是由循环导入引起的。

    dbapp/init.py 导入app/common/models.py 模块,然后整个models.py 模块,包括db 对象,被导入app/init.py 模块。这是db 对象的循环导入。

    改为从models.py 文件中导入您需要的特定对象:

    init.py

    ...
    from app.common.routes import main
    from app.common.models import TipoPoste
    from app.mod_tables.controllers import tables
    ...
    

    这应该可以解决它。

    一个好的做法是不要像您在此处所做的那样导入整个模块。这可能会导致某些名称发生冲突,而这些名称起初可能并不明显。它将为您节省大量调试时间。

    【讨论】:

      【解决方案2】:

      尝试将db 对象移动到models.py。我省略了一些不必要的代码。

      __init__.py

      ...
      from app.common.models import db
      ...
      app = Flask(__name__)
      db.init_app(app)
      ...  
      

      模型.py

      ...
      from flask_sqlalchemy import SQLAlchemy
      db = SQLAlchemy()
      ...
      

      【讨论】:

      • @RobertoFranco 避免“ibutiti”提到的循环导入。
      猜你喜欢
      • 2019-06-09
      • 2018-08-10
      • 1970-01-01
      • 2019-05-01
      • 2022-01-12
      • 2018-09-16
      • 2021-06-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多