【问题标题】:sqlalchemy.exc.InvalidRequestError: One or more mappers failed to initializesqlalchemy.exc.InvalidRequestError:一个或多个映射器未能初始化
【发布时间】:2020-07-20 23:42:06
【问题描述】:

关于尝试通过以下方式使用 SQLAlchemy 在 SqlLiteDb 中插入新记录:

user_1=User(username='First User',userEmail='first@email.com',password='password')

我收到以下错误:

sqlalchemy.exc.InvalidRequestError: One or more mappers failed to initialize - can't proceed with initialization of other mappers. Triggering mapper: 'mapped class User->user'. Original exception was: When initializing mapper mapped class User->user, expression 'Post' failed to locate a name ('Post'). If this is a class name, consider adding this relationship() to the <class 'flaskblog.User'> class after both dependent classes have been defined.
class User(flaskDb.Model):
    id = flaskDb.Column(flaskDb.Integer, primary_key=True)
    username = flaskDb.Column(flaskDb.String(20), unique=True, nullable=False)
    userEmail = flaskDb.Column(flaskDb.String(
        120), unique=True, nullable=False)
    password = flaskDb.Column(flaskDb.String(20), nullable=False)
    image_file = flaskDb.Column(flaskDb.String(
        20), nullable=False, default="default.jpg")
    posts = flaskDb.relationship('Post', backref="author", lazy=True)

    def __repr__(self):
        return f"User('{self.username}','{self.userEmail}','{self.image_file}')"


class Post(flaskDb.Model):
    id = flaskDb.Column(flaskDb.Integer, primary_key=True, nullable=False)
    title = flaskDb.Column(flaskDb.String(25), nullable=False)
    content = flaskDb.Column(flaskDb.Text, nullable=False)
    datePosted = flaskDb.Column(
        flaskDb.DateTime, nullable=False, default=datetime.utcnow)
    user_id = flaskDb.Column(
        flaskDb.Integer, flaskDb.ForeignKey('user.id'), nullable=False)

    def __repr__(self):
        return f"Post('{self.title}','{self.datePosted}','{self.title}')"

接下来我可以尝试什么?

【问题讨论】:

  • SQLAlchemy 不会把类的表名改成小写吗? IE。你在User 模型中的关系应该是'post' 而不是'Post'

标签: python python-3.x flask sqlalchemy flask-sqlalchemy


【解决方案1】:

您遇到循环依赖错误。

而不是将帖子放在 Sser 中。

posts = flaskDb.relationship('Post', backref="author", lazy=True)

删除它并将其放在帖子上。

user = flaskDb.relationship('User', backref="posts", lazy=True)

您仍然可以通过以下方式访问用户:

usera = User.query.get(1)
usera.posts

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-11
    • 2016-04-15
    • 2014-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多