【问题标题】:flask sqlalchemy UniqueConstraint with foreignkey attribute具有外键属性的烧瓶 sqlalchemy UniqueConstraint
【发布时间】:2017-06-02 01:31:18
【问题描述】:

我正在使用 Flask 构建一个应用,其中包含 Projects 和 Plates 的模型,其中 Plates 将 Project 作为外键。

每个项目都有一个年份,以整数形式给出(2017 年为 17);每个板块都有一个编号和一个名称,由 plate.project.year 和 plate.number 构成。例如,今年完成的项目中的板 106 将具有名称“17-0106”。我希望这个名字是独一无二的。

这是我的模型:

class Project(Model):
    __tablename__   = 'projects'
    id              = Column(Integer, primary_key=True)
    name            = Column(String(64),unique=True)
    year            = Column(Integer,default=datetime.now().year-2000)

class Plate(Model):
    __tablename__   = 'plates'
    id              = Column(Integer, primary_key=True)
    number          = Column(Integer)
    project_id      = Column(Integer, ForeignKey('projects.id'))
    project         = relationship('Project',backref=backref('plates',cascade='all, delete-orphan'))

    @property
    def name(self):
        return str(self.project.year) + '-' + str(self.number).zfill(4)

我的第一个想法是使数字在具有相同 project.year 属性的板块中唯一,所以我尝试了变化 __table_args__ = (UniqueConstraint('project.year', 'number', name='_year_number_uc'),),但这需要访问另一个表。

有没有办法在数据库中做到这一点?或者,如果做不到这一点,可以使用 __init__ 方法来检查 number/project.year 组合或 name 属性的唯一性?

【问题讨论】:

    标签: python flask sqlalchemy flask-sqlalchemy unique-constraint


    【解决方案1】:

    您的问题有多种解决方案。例如,您可以对 project.year-number 组合进行反规范化并将其存储为单独的 Plate 字段。然后你可以在上面放一个唯一的钥匙。问题是你将如何保持这个价值。两个明显的选项是触发器(假设您的数据库支持触发器并且您可以使用它们)或 sqla 事件,请参阅http://docs.sqlalchemy.org/en/latest/orm/events.html#

    两种解决方案都不会发出额外的 SELECT 查询。我相信这对你很重要。

    你的问题有点类似于Can SQLAlchemy events be used to update a denormalized data cache?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-15
      • 2016-09-06
      • 2021-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-29
      • 2021-08-27
      相关资源
      最近更新 更多