首页 > 解决方案 > 是否可以在sqlalchemy中使主键和外键一起唯一

问题描述

我有这样的表,我想要siteid并且device是唯一的,并且该表必须有一个主键。所以我将设备分配为主键。

class SiteRoleMapping(db.Model):
    __table_name__ = "site_role_mapping"
    siteid = Column(ForeignKey(('cmp_site.id'), ondelete='CASCADE'), nullable=False)
    device = Column(String, primary_key=True)
    rolename = Column(String)
    description = Column(String, default="None")

标签: pythonsqlalchemyprimary-keyunique-constraintcomposite-key

解决方案


在不了解您的数据库的情况下,我认为您应该只为映射提供一个整数主键,并在您想要唯一的两个字段上添加一个唯一约束。

像这样:

from sqlalchemy import UniqueConstraint

class SiteRoleMapping(db.Model):
    __table_name__ = "site_role_mapping"
    id = Column(Integer, primary_key)
    site_id = Column(ForeignKey('cmp_site.id', ondelete='CASCADE'), nullable=False)
    device = Column(String, primary_key=True)
    rolename = Column(String)
    description = Column(String, default="None")

    # add unique constraint
    __table_args__ = (UniqueConstraint('site_id', 'device'), )

但是,阅读表名映射,听起来您正在实现站点和角色之间的多对多关系。这通常使用三张表来完成,一张用于站点,一张用于角色,一张用于映射

所以我希望一个映射有两个外键,而不仅仅是一个。


推荐阅读