Flask, SQLAlchemy, Data Tables - ImportError: невозможно импортировать имя 'db' в Models.py - PullRequest
0 голосов
/ 16 октября 2018

Я пытаюсь использовать таблицы данных с 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)

Код Thos выдает мне следующую ошибку:

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'

Есть подсказка?Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 16 октября 2018

Ваша ошибка вызвана циклическим импортом.

db импортируется из app/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
...

Это должно исправить это.

Хорошая практика - не импортировать целые модули, как вы сделали здесь.Это может вызвать конфликты в некоторых именах, которые поначалу могут быть неочевидны.Это сэкономит вам много времени на отладку.

0 голосов
/ 16 октября 2018

Попробуйте переместить db объект в models.py.Я опустил некоторый ненужный код.

__ init__.py

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

models.py

...
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...