【问题标题】:SQLAlchemy - Error with self-referring tableSQLAlchemy - 自引用表错误
【发布时间】:2019-05-05 07:52:12
【问题描述】:

我正在尝试构建一个系统,用户可以在其中回复其他帖子的帖子,但是当我尝试运行该程序时出现错误:

sqlalchemy.exc.InvalidRequestError:
    One or more mappers failed to initialize - can't proceed with initialization of other mappers.
    Triggering mapper: 'Mapper|Post|post'.
    Original exception was: 'Table' object has no attribute 'id'

这是我的代码:

class Post(db.Model):
    id = db.Column(db.Integer, primary_key=True, default=pidgen.gen(8))
    title = db.Column(db.String(500))
    body = db.Column(db.String(10000))
    timestamp = db.Column(db.DateTime, index=True, default=datetime.utcnow)
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
    children = db.relationship('Post', backref='parent', lazy='dynamic')
    group_id = db.Column(db.Integer, db.ForeignKey('group.id'))
    parent_id = db.Column(db.Integer, db.ForeignKey('post.id'))
    def __repr__(self):
        return '<Post {}>'.format(self.body)

【问题讨论】:

    标签: python sql sqlalchemy flask-sqlalchemy


    【解决方案1】:

    您的代码对我有用。还有什么你不包括的吗?您如何执行数据库创建?

    这是我运行它的方式。我不得不添加自己的用户和组,并删除了 pidgen.get(),因为我不清楚它们的来源。

    from flask import Flask
    from flask_sqlalchemy import SQLAlchemy
    from datetime import datetime
    import pytz
    
    app = Flask(__name__)
    app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////tmp/test.db'
    db = SQLAlchemy(app)
    
    class User(db.Model):
        id = db.Column(db.Integer, primary_key=True)
        username = db.Column(db.String(80), unique=True, nullable=False)
        def __repr__(self):
            return '<User %r>' % self.username
    
    class Group(db.Model):
        id = db.Column(db.Integer, primary_key=True)
        name = db.Column(db.String(80), unique=True, nullable=False)
        def __repr__(self):
            return '<Group %r>' % self.name
    
    class Post(db.Model):
        id = db.Column(db.Integer, primary_key=True)
        title = db.Column(db.String(500))
        body = db.Column(db.String(10000))
        timestamp = db.Column(db.DateTime, index=True, default=datetime.utcnow)
        user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
        children = db.relationship('Post', backref='parent', lazy='dynamic')
        group_id = db.Column(db.Integer, db.ForeignKey('group.id'))
        parent_id = db.Column(db.Integer, db.ForeignKey('post.id'))
        def __repr__(self):
            return '<Post {}>'.format(self.body)
    
    db.create_all()
    

    运行:

    python testapp.py
    

    给我这个

    sqlite> .schema post
    CREATE TABLE post (
        id INTEGER NOT NULL, 
        title VARCHAR(500), 
        body VARCHAR(10000), 
        timestamp DATETIME, 
        user_id INTEGER, 
        group_id INTEGER, 
        parent_id INTEGER, 
        PRIMARY KEY (id), 
        FOREIGN KEY(user_id) REFERENCES user (id), 
        FOREIGN KEY(group_id) REFERENCES "group" (id), 
        FOREIGN KEY(parent_id) REFERENCES post (id)
    );
    CREATE INDEX ix_post_timestamp ON post (timestamp);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-09
      • 2018-04-24
      • 2021-05-02
      • 2011-06-21
      • 1970-01-01
      • 2018-05-09
      相关资源
      最近更新 更多