【问题标题】:Facebook Style Messaging System in SQLAlchemySQLAlchemy 中的 Facebook 风格消息系统
【发布时间】:2013-08-10 20:10:08
【问题描述】:

如何在 SQLAlchemy 和 Flask 中制作 Facebook 风格的消息传递系统(基于 http://www.9lessons.info/2013/05/message-conversation-database-design.html)? 这是我目前的模型,但我不断收到不明确的外键错误,我假设基于我的对话表。

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True)
    password = db.Column(db.String(12), unique=False)
    conversation = db.relationship('Conversation',backref='user',lazy='dynamic')
    conversation_reply = db.relationship('Conversation_Reply',backref='user',lazy='dynamic')

class Conversation(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    user1 = db.Column(db.Integer, db.ForeignKey("user.id"))
    user2 = db.Column(db.Integer, db.ForeignKey("user.id"))
    timestamp = db.Column(db.DateTime)
    conversation_reply = db.relationship('Conversation_Reply',backref='conversation',lazy='dynamic')

class Conversation_Reply(db.Model):
    id = db.Column(db.Integer, primary_key = True)
    reply = db.Column(db.Text)
    user_id_fk = db.Column(db.Integer, db.ForeignKey("user.id"))
    time = db.Column(db.DateTime)
    c_id_fk = db.Column(db.String(11), db.ForeignKey("conversation.id"))

【问题讨论】:

    标签: sql sqlalchemy flask flask-sqlalchemy


    【解决方案1】:

    如果用户是 user1 还是 user2,您可能希望指定加入条件以获取两个对话,您可以执行以下操作:

    class User(db.Model):
        # ...
        # Converstations where either user1 or user2 is this user.
        all_conversations = db.relationship('Conversation',
            primaryjoin='or_(User.id == Conversation.user1_id, User.id == ' \
            'Conversation.user2_id)', lazy='dynamic')
        # Replies where this is this user.
        replies = db.relationship("Reply", backref="user")
    
    class Conversation(db.Model):
        # ...
        user1_id = db.Column(db.Integer, db.ForeignKey("user.id"))
        user2_id = db.Column(db.Integer, db.ForeignKey("user.id"))        
        user1 = db.relationship('User', foreign_keys=[user1_id], 
            backref='conversations_as_user1')       
        user2 = db.relationship('User', foreign_keys=[user2_id], 
            backref='conversations_as_user2')
        # Replies to this conversation.
        replies = db.relationship("Reply", backref="conversation")
    
    class Reply(db.Model):
        # ...
        user_id = db.Column(db.Integer, db.ForeignKey("user.id"))
        conversation_id = db.Column(db.Integer, db.ForeignKey("conversation.id"))
    

    您可能希望根据发起对话的人将 user1 和 user2 更改为 from_userto_user

    【讨论】:

    • 感谢您的回复!我唯一注意到的是,当您尝试向数据库提交任何内容时,SQLAlchemy 会引发回复表的接口错误。知道为什么会发生这种情况吗? class Reply(db.Model): #id reply = db.Column(db.Text) user_id = db.Column(db.Integer, db.ForeignKey("user.id")) conversation_id = db.Column(db.Integer, db.ForeignKey("conversation.id")) def __init__(self,reply, user_id, conversation_id): self.reply = reply self.user_id = user_id self.conversation_id = conversation_id
    • 实际错误是什么?有主键吗,上一条评论里贴的代码好像id被注释掉了?
    • 当我尝试将回复对象提交到数据库时,实际错误是“sqlalchemy.exc.InterfaceError”。我注释掉 id 只是为了节省空间,因为 StackOverflow 在 cmets 上的字符有限。知道为什么会这样吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多