2

这个问题本质上是两部分。1. 我有一种情况,我要求事物是唯一的,即 db 中的元素需要彼此唯一。

假设我们有一个模型事物(Rough PseudoCode)

Class ShoppingList( object ):
     thing1_id = Column(Integer)
     thing2_id = Column(Integer)

现在我需要thing1_id 和thing2_id 是唯一的,即thing1_id 和thing2_id 的集合必须是唯一的。来自 django 世界,我知道您可以在 unique_together 的 django 模型中进行元声明。但是在涡轮齿轮箱中怎么可能做到这一点。

  1. 另外,我如何在遗留系统上实际应用 unique_together。
4

2 回答 2

5

您只是想在UniqueConstraint表定义中添加一个(使用主键可以达到类似的效果,但语义不同)。

这很简单:

Class ShoppingList( object ):
    thing1_id = Column(Integer)
    thing2_id = Column(Integer)

    __table_args__ = (
        UniqueConstraint('thing1_id', 'thing2_id'),
    )

另请参阅https://docs.sqlalchemy.org/en/latest/orm/extensions/declarative/table_config.html#table-configuration

于 2013-07-19T13:54:07.550 回答
1
  1. 对于您问题的第一部分,如果我正确理解您的问题,我相信您正在谈论定义复合主键的必要性。如http://docs.sqlalchemy.org/en/latest/core/schema.html#describing-databases-with-metadata所述:

    可以为多个列分配 primary_key=True 标志,该标志表示多列主键,称为复合主键。

    在 SQLAlchemy 中使用声明性 ORM 方式在类上定义这样的关系应该很简单:

    class ShoppingList(Base):
        thing1_id = Column(Integer, primary_key=True)
        thing2_id = Column(Integer, primary_key=True)
    
  2. 至于您问题的第二部分,我相信您的意思是如何为现有的遗留数据库定义相同的 SQLAlchemy 映射。如果是这样,您应该可以使用上述方法,只是不要从 ORM 定义中创建数据库。您也可以使用经典的映射方式,描述于:http ://docs.sqlalchemy.org/en/rel_0_8/orm/mapper_config.html?highlight=composite%20primary%20key#classical-mappings

于 2013-04-14T20:44:26.000 回答