【问题标题】:A django like unique together in turbogears/sqlalchemy在 turbogears/sqlalchemy 中独一无二的 django
【发布时间】:2013-04-06 06:07:23
【问题描述】:

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

假设我们有一个模型 Things (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。

【问题讨论】:

    标签: python django sqlalchemy turbogears


    【解决方案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

    【讨论】:

      【解决方案2】:

      您只是想在表定义中添加一个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

      【讨论】:

        猜你喜欢
        • 2018-08-30
        • 1970-01-01
        • 2018-09-23
        • 2021-03-02
        • 1970-01-01
        • 2019-03-28
        • 1970-01-01
        • 2019-05-01
        • 1970-01-01
        相关资源
        最近更新 更多