thought i'd post the code I came up with for reference:
from sqlalchemy import *
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relationship, sessionmaker
from sqlalchemy.ext.associationproxy import association_proxy
Base = declarative_base()
def _create_inheritance(supertype, subtype):
return Inheritance(supertype, subtype)
inheritance_table = Table('inheritance', Base.metadata,
Column('sub_name', String(50), ForeignKey('types.name'),
primary_key=True),
Column('super_name', String(50), ForeignKey('types.name'),
primary_key=True))
class Type(Base):
__tablename__ = 'types'
name = Column(String(50), primary_key=True)
abstract = Column(Boolean)
top = Column(Boolean)
subtypes = relationship('Type',
secondary=inheritance_table,
primaryjoin=inheritance_table.c.super_name==name,
secondaryjoin=inheritance_table.c.sub_name==name,
backref='supertypes')
def hasSuper(self):
return self.supertypes.length > 0
def hasSub(self):
return self.subtypes.length > 0
def isAnySubOf(self, tp):
#to check for cyclic inheritance
if self == tp:
return True
for typ in self.supertypes:
if typ.isAnySubOf(tp):
return True
return False
def isAnySuperOf(self, tp):
return tp.isAnySubOf(self)
def addSub(self, tp):
#some types cannot have supertypes:
if not tp.top:
#to check for cyclic inheritance:
if not self.isAnySubOf(tp):
self.subtypes.append(tp)
else: raise Exception("cyclic inheritance")
else: raise Exception(str(tp) + " cannot have supertype")
def addSuper(self, tp):
tp.addSub(self)
def __init__(self, name, top = False, abstract = False):
self.name = name
self.top = top
self.abstract = abstract
def __repr__(self):
return "Type(%r)" % (self.name)
engine = create_engine('sqlite:///:memory:', echo=False)
Base.metadata.create_all(engine)
if __name__ == "__main__":
Session = sessionmaker(bind=engine)
session = Session()
try:
c1 = Type("A")
c2 = Type("B")
c3 = Type("C")
c1.addSub(c2)
c3.addSuper(c1)
c3.addSuper(c2)
c3.addSub(c1) #<= would be cyclic
print "c1.subs"
for c in c1.subtypes:
print " " + str(c)
print "c1.supers"
for c in c1.supertypes:
print " " +str(c)
print "c2.subs"
for c in c2.subtypes:
print " " + str(c)
print "c2.supers"
for c in c2.supertypes:
print " " + str(c)
print "c3.subs"
for c in c3.subtypes:
print " " + str(c)
print "c3.supers"
for c in c3.supertypes:
print " " + str(c)
except Exception, e:
print "error: " + str(e)
--
You received this message because you are subscribed to the Google Groups
"sqlalchemy" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/sqlalchemy?hl=en.