模型继承中的sqlalchemy约束

时间:2013-10-12 13:51:32

标签: python sqlalchemy

我有两个简单的模型:

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

如何定义约束sender_id!= receiver_id?

1 个答案:

答案 0 :(得分:1)

这似乎不适用于已连接的表继承,我已经尝试过并且在sender_id中创建约束时抱怨Message中的列ChatMessage不存在

这种抱怨是有道理的,因为sender_id在创建表时不会与receiver_id在同一个表中,因此需要遵循外键关系来检查约束。 / p>

一种选择是将ChatMessage作为一个表格。

使用放置在表格中的CheckConstraint

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),
    )