简体   繁体   English

在sqlalchemy中具有额外字段的自引用数据库

[英]Self-referential database with extra fields in sqlalchemy

I want to write a self-referential database structure for my messaging system using Flask and SQLAlchemy. 我想使用Flask和SQLAlchemy为我的消息传递系统编写一个自引用数据库结构。 Tables are very simple: 表格非常简单:

class User(db.Model):
    __tablename__ = 'user'
    id = Column(Integer, primary_key=True)
    messages = db.relationship(...)

    def addMessage (self, friend, message):
       ...
       self.messages.append(friend)
       return self

and message table is: 消息表是:

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

    id = db.Column(db.Integer, primary_key=True)
    emmiter_id = db.Column(db.Integer, db.ForeignKey('user.id'))
    receiver_id = db.Column(db.Integer, db.ForeignKey('user.id'))
    text = db.Column(db.Text)

I want to know how will the relationship with my user table look like? 我想知道与user表的关系如何? and how can I insert data on the message table? 以及如何在message表中插入数据?

This is what I wrote in user table as relationship, but it is not working: 这是我在user表中作为关系写的,但是它不起作用:

messages = db.relationship('User',
    secondary = Message,
    primaryjoin = (Message.emmiter_id == id),
    secondaryjoin = (Message.receiver_id == id),
    backref = db.backref('correspondence', lazy = 'dynamic'),
    lazy = 'dynamic')

After working a lot around this problem I found the solution with primaryjoin between user table and message table. 在解决了许多问题之后,我找到了在用户表和消息表之间使用primaryjoin的解决方案。 Here is the working code 这是工作代码

# Messaging system table
class Message(db.Model):
    __tablename__ = 'message'

    emmiter_id = db.Column(db.Integer, db.ForeignKey('user.id'), primary_key=True)
    recipient_id = db.Column(db.Integer, db.ForeignKey('user.id'), primary_key=True)
    text = db.Column(db.Text, nullable=False)

and user table like : 和用户表,如:

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

    id = db.Column(db.Integer, primary_key=True)
    inbox = db.relationship('Message',backref='sender', primaryjoin=id==Message.emmiter_id)
    outbox = db.relationship('Message',backref='receiver', primaryjoin=id==Message.recipient_id)

and here is how you can add a message in message table: 这是在消息表中添加消息的方法:

message = Message(text="dsf", sender=sender , receiver=receiver)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM