2010-08-20 23 views
7

Une première classe appelée Parametric est utilisé pour créer des objets qui peuvent avoir des paramètres qui leur sont associés:contrainte unique à l'aide des données dans plusieurs tables (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) 

J'utilise SQLAlchemy pour mon moteur ORM.

Je veux imposer une contrainte UNIQUE qui assure que la combinaison (name, prop) sont uniques pour une classe donnée (par exemple, une seule instance de Foo peut être appelé "my_foo" et ont une valeur prop, disons "my_prop"), mais Je ne vois pas comment référencer la colonne name de Parametric dans la section Foo table UNIQUECONSTRAINT.

Est-ce que cette unicité peut être imposée via les directives FOREIGN KEY?

+0

Dans le même temps vous avez une instance de Foo appelée my_foo avec une valeur de prop de my_prop, pouvez-vous également avoir une instance de Bar appelée my_foo (pas une faute de frappe) avec un prop appelé my_prop? –

+0

Ce n'est pas un code sqlalchemy. Il existe de nombreuses approches différentes de l'héritage dans sqlalchemy, mais je peux vous dire tout de suite que vous ne pouvez configurer que des contraintes internes (sans créer de tables supplémentaires) si vous utilisez l'héritage de tables partagées - vos colonnes 'prop' et' name' dans la même table pour le faire. – letitbee

+0

Etes-vous peut-être en train de faire ce que font les mixins? http://www.sqlalchemy.org/docs/orm/extensions/declarative.html#mixin-classes –

Répondre

2

Vous pouvez le faire en utilisant single table inheritance. Cependant si vos deux colonnes sont dans des tables différentes, vous ne pouvez pas faire exactement ce que vous essayez de faire (il n'est pas possible de faire une contrainte unique entre les tables). Si l'héritage de table unique n'est pas une option, vous voulez probablement soit (1) appliquer l'unicité dans python, soit (2) abandonner l'héritage de sqlalchemy, et utiliser simplement une clé étrangère pour lier Foo et Bar à Parametric. Vous pouvez clé étrangère à name, et puis faire une contrainte unique sur name et prop.