简体   繁体   中英

sqlalchemy constraint in models inheritance

I have two simple models:

class Message(Backend.instance().get_base()):
    __tablename__ = 'messages'
    id = Column(Integer, primary_key=True, autoincrement=True)
    sender_id = Column(Integer, ForeignKey('users.id')) 
    content = Column(String, nullable=False)


class ChatMessage(Message):
    __tablename__ = 'chat_messages'
    id = Column(Integer, ForeignKey('messages.id'), primary_key=True)
    receiver_id = Column(Integer, ForeignKey('users.id'))

How to define constraint sender_id!=receiver_id?

This doesn't seem to work with joined table inheritance, I've tried and it complains that the column sender_id from Message doesn't exist when creating the constraint in ChatMessage .

This complaint makes sense, since sender_id wouldn't be in the same table as receiver_id when the tables are created, so the foreign key relationship would need to be followed to check the constraint.

One option is to make ChatMessage a single table.

Use CheckConstraint , placed in table args.

class ChatMessage(Base):
    __tablename__ = 'chat_messages'
    id = sa.Column(sa.Integer, primary_key=True)
    sender_id = sa.Column(sa.Integer, sa.ForeignKey(User.id))
    receiver_id = sa.Column(sa.Integer, sa.ForeignKey(User.id))
    content = sa.Column(sa.String, nullable=False)

    __table_args__ = (
        sa.CheckConstraint(receiver_id != sender_id),
    )

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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