【问题标题】:How is a unique constraint across three columns defined?如何定义跨三列的唯一约束?
【发布时间】:2014-11-12 19:43:39
【问题描述】:

以下EventInvitation 模型是一个事件的简单邀请,从一个用户发送给另一个用户。我想确保邀请在三个列中是唯一的:to_user、from_user 和 event。

class EventInvitation(db.Model):
    __tablename__ = 'event_invitations'

    id = db.Column(db.Integer, primary_key = True)

    event_id = db.Column(db.Integer, db.ForeignKey('events.id'))
    event = db.relationship('Event',  foreign_keys=[event_id])
    created = db.Column(db.DateTime(), default=datetime.now)
    updated = db.Column(db.DateTime(), default=datetime.now,onupdate=datetime.now)

    from_id = db.Column(db.Integer, db.ForeignKey('users.id'))
    from_user = db.relationship('User',  foreign_keys=[from_id])

    to_id = db.Column(db.Integer, db.ForeignKey('users.id'))
    to_user = db.relationship('User',  foreign_keys=[to_id])

    cstrt = db.UniqueConstraint('event_id', 'from_id','to_id', name='uix_1')

我尝试使用此 cstrt 列,但它不起作用。该约束应该适用于 SQLite,以及生产中的 MySQL。如何定义此唯一约束?

【问题讨论】:

    标签: python sqlalchemy flask-sqlalchemy


    【解决方案1】:

    您需要将约束添加到表,而不是模型。使用声明式来做到这一点:

    class EventInvitation(db.Model):
        # ...
        __table_args__ = (
            db.UniqueConstraint(event_id, from_id, to_id),
        )
    

    如果该表已在数据库中创建,您需要删除该表并再次运行 db.create_all(),或使用 Alembic 通过迁移更改现有表。

    【讨论】:

      【解决方案2】:

      我不同意接受的答案。这不是代码不起作用的原因。

      它不起作用的原因是你引用了列的名称。

      如果你写:

          cstrt = db.UniqueConstraint(event_id, from_id, to_id, name='uix_1')
      

      一切都会好起来的。

      当然,它也可以使用 table_args:

          __table_args__ = (
          db.UniqueConstraint(event_id, from_id, to_id),
      )
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-23
        • 2011-10-02
        • 2022-10-05
        • 2019-02-14
        • 1970-01-01
        • 2021-12-13
        相关资源
        最近更新 更多