django在turbogears / sqlalchemy中独一无二

时间:2013-04-13 21:07:28

标签: python django sqlalchemy turbogears

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

让我们说我们有一个模型的东西(粗糙的伪代码)

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。

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分: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

  3. 中所述