Доступ к БД из отдельного файла фляги SQLAlchemy python3 - PullRequest
0 голосов
/ 22 июня 2019

Я пишу колбу-приложение. У меня есть два файла. main.py и database.py. Я хочу создать базу данных из файла database.py. Файл main.py должен получить доступ к файлу database.py и создать базу данных и таблицу с именем «Users». Но это показывает ошибку импорта. Помогите мне с этим вопросом

main.py

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from databases import User

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////tmp/data_log.db'
db = SQLAlchemy(app)

if __name__ == '__main__':
    db.create_all()
    app.run(host='0.0.0.0', port=5001)  

databases.py

from main import db
from passlib.apps import custom_app_context as pwd_context

class User(db.Model) :
    __tablename__ = 'users'
    user_id     =   db.Column(db.Integer, primary_key = True)
    username    =   db.Column(db.String(32), index = True)
    password    =   db.Column(db.String(128))
    def hash_password(self, password) :
        self.password =pwd_context.hash(password)
    def verify_password(self, password) :
        return pwd_context.verify(password, self.password)

Traceback:

Traceback (most recent call last):
  File "main.py", line 3, in <module>
    from databases import User
  File "/home/paulsteven/stack/databases.py", line 1, in <module>
    from main import db
  File "/home/paulsteven/stack/main.py", line 3, in <module>
    from databases import User
ImportError: cannot import name 'User'

1 Ответ

0 голосов
/ 22 июня 2019

Это обычный случай конфликта циклического импорта .Трассировка дает вам четкие шаги:

Как это происходит в шагах:

  • вы запускаете main.py
  • поток управления начинает импортировать функции / библиотеки дополучает 3-ю строку from databases import User.
  • и отправляется в модуль databases, чтобы найти необходимый класс User.Но ... User может использовать функции внешней области (и для этого требуется db.Model), поэтому поток управления должен сканировать модуль databases с самого начала.Это отражает 2-й шаг от трассировки ("/home/paulsteven/stack/databases.py", line 1)
  • от позиции предыдущего шага, находящейся на database.py, когда поток управления встречает from main import db - , что означает, что он должен вернуться кмодуль main (main.py)!
  • поток управления, возвращенный в модуль main, снова начинает сканирование с 1-й строки - пока не найдет from databases import User снова.Это отражает 3-й шаг трассировки (File "/home/paulsteven/stack/main.py", line 3)
    • , и вы попадаете в цикл ...

Как правильно решитьПроблема?
Храните все контексты БД / модели БД в отдельных модулях.
Следуйте последовательности отношений объектов и их зависимости друг от друга:

---> Сначала создается приложение (app)

  • ---> затем создается экземпляр структуры БД db = SQLAlchemy(app) в зависимости от app

    • ---> затем настраиваемая БДсозданные модели (например, User(db.Model)) в зависимости от db экземпляр

main.py

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
# from databases import User  <--- shouldn't be here

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////tmp/data_log.db'
db = SQLAlchemy(app)

if __name__ == '__main__':
    from databases import User  #  after instantiating `db` import model(s) 
    db.create_all()
    app.run(host='0.0.0.0', port=5001)  

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...