【问题标题】:Sqlalchemy thread messaging systemSqlalchemy 线程消息系统
【发布时间】:2013-01-10 06:21:00
【问题描述】:

我是 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'))

但我无法理解一些事情。例如,如何获取用户的所有未读消息计数?或者在某个线程中用户的未读消息计数?

Message 通过message_read_state_relationsUser 有关系。如何在没有message_read_state_relations的情况下将属于该用户的所有线程的所有消息发送给该用户?

或者,也许,我做错了?设计错了吗?我是根据这个问题thread messaging system database schema design

创建的

感谢您的帮助!

【问题讨论】:

    标签: python sqlalchemy many-to-many flask relationship


    【解决方案1】:

    不知道这是否是最好的设计,似乎是合理的。关于您询问的查询,它们可以使用连接和子查询构建,您可能想在 SQLAlchemy 文档中阅读它们。我还建议熟悉此类查询的纯 SQL 方法,因为 SA 试图非常密切地遵循 SQL,而理解 SQL 有助于极大地编写 SA 查询。这是一个查询的示例(获取用户的所有未读消息计数):

    # 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()
    

    【讨论】:

    • 感谢您的回答,但事实并非如此 =) 您可以在此处获得 User#1 创建的所有未读消息。我需要获取属于 User#1 的所有线程的所有未读消息
    【解决方案2】:

    我也在尝试使用 Flask 和 sqlalchemy 开发一个线程消息系统。搜索我找到了你的问题和 django 的 github 存储库(下面的链接)。我认为该模型可能非常有用。如果您仍然感兴趣(6 年后),请给我留言。

    https://github.com/philippWassibauer/django-threaded-messages/blob/master/threaded_messages/models.py

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-26
      • 2010-11-13
      • 2012-02-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多