2

私はsqlalchemyの初心者です。現在、Flask でサイトを開発中です。メッセージシステムをスレッドで編成したい。Facebookのダイアログのようなもの。次のモデルがあり、このコードは機能します:

message_read_state_relations = db.Table('message_message_read_state_relations',
        db.Column('user_id', db.Integer, db.ForeignKey('auth_users.id')),
        db.Column('message_id', db.Integer, db.ForeignKey('messages.id')),
)

class User(db.Model):
        __tablename__ = 'auth_users'

        id = db.Column(db.Integer, primary_key=True)
        email = db.Column(db.String(100))
        password = db.Column(db.String(100))

        messages = db.relationship('Message', backref=db.backref('user'), lazy='dynamic')

        threads = association_proxy('user_thread_relations', 'thread')


class Message(db.Model):
        __tablename__ = 'messages'

        id = db.Column(db.Integer, primary_key=True)
        text = db.Column(db.Text, default='')

        thread_id = db.Column(db.Integer, db.ForeignKey('threads.id'))
        user_id = db.Column(db.Integer, db.ForeignKey('auth_users.id'))

        user_read_states = db.relationship('User', secondary=message_read_state_relations,
                backref=db.backref('message_read_states'), lazy='joined')


class Thread(db.Model):
        __tablename__ = 'threads'

        id = db.Column(db.Integer, primary_key=True)
        subject = db.Column(db.String(255))

        messages = db.relationship('Message', backref=db.backref('thread'), lazy='dynamic')
        users = association_proxy('user_thread_relations', 'user')


class UserThreadRelation(db.Model):
        __tablename__ = 'user_thread_relations'

        user_id = db.Column(db.Integer, db.ForeignKey('auth_users.id'), primary_key=True)
        thread_id = db.Column(db.Integer, db.ForeignKey('threads.id'), primary_key=True)

        is_deleted = db.Column(db.Boolean, default=False)

        user = db.relationship(User, backref=db.backref('user_thread_relations'))
        thread = db.relationship(Thread, backref=db.backref('user_thread_relations'))

しかし、私はいくつかのことを理解できません。たとえば、ユーザーのすべての未読メッセージ数を取得するにはどうすればよいですか? または、一部のスレッドでユーザーの未読メッセージがカウントされますか?

MessageUserviaと関係がありmessage_read_state_relationsます。このユーザーではなく、ユーザーに属するすべてのスレッドに属するすべてのメッセージを取得するにはどうすればよいmessage_read_state_relationsですか?

それとも、私のやり方が間違っているのでしょうか?デザインがおかしい?この質問スレッド メッセージング システム データベース スキーマ設計に基づいて作成しました

助けてくれてありがとう!

4

2 に答える 2

1

それが可能な限り最高のデザインかどうかはわかりませんが、妥当なようです。あなたが質問したクエリに関しては、結合とサブクエリを使用して構築できます。SQLAlchemy ドキュメントでそれらについて読みたいと思うかもしれません。また、SA は SQL にかなり厳密に従おうとするため、そのようなクエリに対する純粋な SQL アプローチに慣れることをお勧めします。SQL を理解すると、SA クエリを作成するのに非常に役立ちます。1 つのクエリの例を次に示します (ユーザーのすべての未読メッセージ数を取得します)。

# First count all the messages.
# On a big set of data this may be very slow operation.
total_msgs = db.session.query(db.func.count(Message.id).label('cnt')).subquery()
# Then count messages read by the user.
read_msgs = db.session.query(db.func.count(Message.id).label('cnt')).\
    join(User.message_read_states).filter(User.id == 1).subquery()
# Subtract read messages count from total count.
unread_count = db.session.query(total_msgs.c.cnt - read_msgs.c.cnt).scalar()
于 2013-01-27T12:24:35.290 に答える