Джанго как уникальный вместе в турбогенераторах /sqlalchemy

Этот вопрос по существу состоит из двух частей. 1. У меня есть ситуация, когда мне нужно, чтобы вещи были уникальными, то есть элементы в БД должны быть уникальными друг с другом.

Допустим, у нас есть модель Things ( Rough PseudoCode)

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

Теперь мне нужно, чтобы thing1_id и thing2_id были уникальными вместе, т.е. набор thing1_id и thing2_id должен быть уникальным вместе. Исходя из мира django, я знаю, что вы можете сделать мета-объявление в моделях django unique_together. Но как это сделать в турбогенераторах.

  1. Также, как мне на самом деле применить unique_together в устаревшей системе.

2 ответа

Решение
  1. Что касается первой части вашего вопроса, то, если я правильно понимаю ваш вопрос, я полагаю, что вы говорите о необходимости определения составных первичных ключей. Как указано в http://docs.sqlalchemy.org/en/latest/core/schema.html:

    Для нескольких столбцов может быть назначен флаг primary_key=True, который обозначает первичный ключ из нескольких столбцов, известный как составной первичный ключ.

    Определение таких отношений в классе с использованием декларативного способа ORM в SQLAlchemy должно быть простым:

    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

Вы просто хотите добавить UniqueConstraint к определению вашей таблицы (использование первичного ключа приведет к аналогичным эффектам, но, тем не менее, с другой семантикой).

Это так просто, как:

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

    __table_args__ = (
        UniqueConstraint(thing1_id, thing2_id),
    )

Смотрите также http://docs.sqlalchemy.org/en/rel_0_8/orm/extensions/declarative.html

Другие вопросы по тегам