Уникальное ограничение с использованием данных в нескольких таблицах (SQL/SQLAlchemy)

Верхний класс с именем Parametric используется для создания объектов, которые могут иметь связанные с ними параметры:

class Parametric(object):
 def __init__(self, name):
  self.name = name
  self.pars = []

class Foo(Parametric):
 def __init__(self, name, prop):
  self.prop = prop
  Parametric.__init__(self, name)

class Bar(Parametric):
 def __init__(self, name, prop):
  self.prop = prop
  Parametric.__init__(self, name)

Я использую SQLAlchemy для своего механизма ORM.

Я хочу наложить ограничение UNIQUE, которое гарантирует, что комбинация (name, prop) уникальна для данного класса (например, только один экземпляр Foo может называться "my_foo" и иметь значение prop, скажем, "my_prop"), но я не посмотрите, как ссылаться на столбец name из Parametric в разделе Foo таблицы UNIQUECONSTRAINT.

Является ли эта уникальность чем-то, что можно навязать с помощью директив FOREIGN KEY?


person Escualo    schedule 20.08.2010    source источник
comment
В то же время у вас есть экземпляр Foo с именем my_foo со значением реквизита my_prop. Можете ли вы также иметь экземпляр Bar с именем my_foo (не опечатка) с реквизитом my_prop?   -  person Mike Sherrill 'Cat Recall'    schedule 12.01.2011
comment
Это не код sqlalchemy. Существует много разных подходов к наследованию в sqlalchemy, но я могу сразу сказать, что вы можете настроить ограничения в базе (без создания дополнительных таблиц), только если вы используете наследование общих таблиц - ваши столбцы prop и name должны быть в одной таблице. сделать это.   -  person letitbee    schedule 20.05.2011
comment
Возможно, вы пытаетесь сделать то, что делают миксины? sqlalchemy.org/docs/orm/extensions/   -  person X-Istence    schedule 22.06.2011


Ответы (1)


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

Если наследование одной таблицы невозможно, вы, вероятно, захотите либо (1) обеспечить уникальность в python, либо (2) отказаться от наследования sqlalchemy и просто использовать внешний ключ для связи Foo и Bar с Parametric. Вы можете использовать внешний ключ для name, а ЗАТЕМ сделать уникальное ограничение для name и prop.

person Dave    schedule 19.09.2011