SQLAlchemy - ошибка с самообращающейся таблицей - PullRequest
0 голосов
/ 04 декабря 2018

Я пытаюсь создать систему, в которой пользователи могут отвечать на сообщения с другими сообщениями, но я получаю сообщение об ошибке при попытке запустить программу:

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)

1 Ответ

0 голосов
/ 04 декабря 2018

Ваш код работает на меня.Есть ли что-то еще, что вы не включили?Как вы выполняете создание БД?

Вот как я это запустил.Мне пришлось добавить своих собственных пользователей и группы и удалить 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);
...