导入错误:无法从部分初始化的模块“app”导入名称“db”

问题描述 投票:0回答:1

每当我尝试运行 main.py 时,我都会收到此错误 这真的让我很沮丧,因为我似乎无法弄清楚确切的问题是什么。如有任何帮助,我将不胜感激。

我的错误

回溯(最近一次调用最后一次): 文件“C:\Users usco\PycharmProjects ooklibrary\main.py”,第 1 行,位于 从应用程序导入数据库 文件“C:\Users usco\PycharmProjects ooklibrary pp.py”,第 4 行,位于 从模型导入用户作为用户 文件“C:\Users usco\PycharmProjects ooklibrary\model.py”,第 3 行,位于 从应用程序导入数据库 ImportError:无法从部分初始化的模块“app”导入名称“db”(很可能是由于循环导入)

(C:\Users usco\PycharmProjects ooklibrary pp.py)

我的模型.py



from sqlalchemy import ForeignKey
from sqlalchemy.orm import relationship
from app import db
from flask_login import UserMixin

class User(UserMixin, db.Model):
id = db.Column(db.Integer, primary_key=True)
first_name = db.Column(db.String(30), nullable=False)
last_name = db.Column(db.String(30), nullable=False)
contact = relationship("Contact", uselist=False, backref="user")
password = relationship("Password", uselist=False, backref="user")
books = relationship('Book', secondary='userbook', backref="user")
roles = relationship('Role', secondary='userrole', backref="user")

class Book(db.Model):
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(300), unique=True)
isbn = db.Column(db.String(11), unique=True)
year = db.Column(db.String(4))
users = relationship('User', secondary='userbook', backref="book")

class Contact(db.Model):
id = db.Column(db.Integer, primary_key=True)
phone_number1 = db.Column(db.String(15), unique=True)
phone_number2 = db.Column(db.String(15), unique=True)
email = db.Column(db.String(50), unique=True)
address = db.Column(db.String(200))
user_id = db.Column(db.integer, ForeignKey=('user.id'))

class Password(db.Model):
id = db.Column(db.Integer, primary_key=True)
password = db.Column(db.String(200), unique=True, )
user_id = db.Column(db.integer, ForeignKey=('user.id'))

class Role(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(20), unique=True, )
users = relationship('User', secondary='user_role', backref="role")

class UserRole(db.Model):
user_id = db.Column(db.Integer, ForeignKey('user.id'), primary_key=True)
role_id = db.Column(db.Integer, ForeignKey('role.id'), primary_key=True)

class UserBook(db.Model):
user_id = db.Column(db.Integer, ForeignKey('user.id'), primary_key=True)
book_id = db.Column(db.Integer, ForeignKey('book.id'), primary_key=True)

#我的应用程序.py

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_login import LoginManager
from model import User

app = Flask(__name__)
app.config['SECRET_KEY'] = 'mysecret'
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///bookdb'
db = SQLAlchemy(app)

login_manager = LoginManager(app)
login_manager.login_view = 'login'


@login_manager.user_loader
def load_user(user_id):
    return User.query.get(int(user_id))


我的main.py


from app import db
from routes import *

if __name__ == '__main__':
    app.app_context().push()
    db.create_all()
    app.run(debug=True)
python flask flask-sqlalchemy
1个回答
0
投票

请注意,在

model.py
中,您尝试从
db
导入
app.py
,而在
app.py
中,您尝试从
User
导入
model.py
。正如错误消息中所述,这称为循环导入。

这个问题的根本原因是

db = SQLAlchemy(app)
,由于循环导入问题,我认为这不是一个好的做法。根据 flask_sqlalchemy
documentation
,您应该使用
DeclarativeBase
来创建
db
对象。所以类似:

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from sqlalchemy.orm import DeclarativeBase

class Base(DeclarativeBase):
  pass

db = SQLAlchemy(model_class=Base)

(来源:https://flask-sqlalchemy.palletsprojects.com/en/3.1.x/quickstart/

由于

db
不再依赖于
app
,您可以将这段代码移动到自己的文件中,例如
database.py
,然后从
db
中的
database.py
导入
model.py

希望有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.