2010-08-20 15 views
7

Eine Top-Klasse namens mit Parametric verwendet wird, um Objekte zu schaffen, die mit ihnen verbundenen Parameter haben:Einzigartige Beschränkungsdaten in mehreren Tabellen (SQL/SQLAlchemy)

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) 

ich SQLAlchemy für meinen ORM-Engine verwenden.

Ich möchte ein UNIQUE Zwang aufzuerlegen, die sicherstellt, dass die Kombination (name, prop) sind einzigartig für eine bestimmte Klasse (zB nur eine Instanz von Foo"my_foo" aufgerufen werden kann und haben einen prop Wert von "my_prop" sagen), aber Ich sehe nicht, wie man die name Spalte von Parametric in der Foo Tabelle UNIQUECONSTRAINT Abschnitt referenziert.

Ist diese Einzigartigkeit etwas, das über FOREIGN KEY Richtlinien auferlegt werden kann?

+0

Zur gleichen Zeit haben Sie eine Instanz von Foo namens my_foo mit einem Prop-Wert von my_prop, können Sie auch eine Instanz von Bar namens my_foo (kein Tippfehler) mit einer Prop namens my_prop? –

+0

Dies ist kein SQL-Code. Es gibt viele verschiedene Ansätze für die Vererbung in sqlalchemy, aber ich kann Ihnen sofort sagen, dass Sie nur In-Base-Constraints einrichten können (ohne zusätzliche Tabellen zu erstellen), wenn Sie Shared Table-Vererbung verwenden - Ihre 'prop'- und' name'-Spalten sollten sein in der gleichen Tabelle, um das zu tun. – letitbee

+0

Versuchen Sie vielleicht zu tun, was Mixins machen? http://www.sqlalchemy.org/docs/orm/extensions/declarative.html#mixin-classes –

Antwort

2

Sie könnten dies mit single table inheritance tun. Wenn sich Ihre beiden Spalten jedoch in verschiedenen Tabellen befinden, können Sie nicht genau was Sie versuchen zu tun (es ist nicht möglich, eine eindeutige Einschränkung über mehrere Tabellen hinweg). Wenn die Vererbung einzelner Tabellen keine Option ist, möchten Sie wahrscheinlich entweder (1) die Eindeutigkeit in Python erzwingen oder (2) die Vererbung von sqlalchemy abbrechen und einfach einen Fremdschlüssel verwenden, um Foo und Bar mit Parametric zu verknüpfen. Sie könnten einen Fremdschlüssel zu name, und dann eine eindeutige Einschränkung auf name und prop tun.