I don't know whether to laugh or cry ... thanks On Mar 28, 6:25 pm, Michael Bayer <mike...@zzzcomputing.com> wrote: > your enum is set for "uni", "list", "set" and you're passing in "one" > > On Mar 28, 2011, at 6:35 AM, farcat wrote: > > > > > > > > > Hi all, > > > I am stuck on an integrity error. The code worked before, but i cannot > > figure out what changed so it does not anymore. It is possibly a dumn > > oversight. > > > The code is: > > > from sqlalchemy import * > > from sqlalchemy.ext.declarative import declarative_base > > from sqlalchemy.orm import relationship > > from sqlalchemy.orm.session import sessionmaker > > > Base = declarative_base() > > > def trim(txt): > > txt.strip() > > return txt > > > inheritance_table = Table('inheritance', Base.metadata, > > Column('sub_name', String(50), ForeignKey('Type.name'), > > primary_key=True), > > Column('super_name', String(50), ForeignKey('Type.name'), > > primary_key=True)) > > > class Member(Base): > > __tablename__ = 'Member' > > name = Column(String(50), primary_key=True) > > multiplicity = Column(Enum("uni", "list", "set"), nullable = > > False) > > reference = Column(Boolean, nullable = False) > > type_name = Column(String(50),ForeignKey('Type.name'), nullable = > > False) > > of_type_name = Column(String(50),ForeignKey('Type.name'), > > primary_key=True) > > def __init__(self, name, type, multiplicity = "uni", reference = > > False): > > self.name = trim(name) > > self.type = type > > self.reference = reference > > self.multiplicity = multiplicity > > def __repr__(self): > > return "Member(%r, %r, %r, %r, %r)" % (self.name, > > self.of_type_name, > > self.type_name, > > self.multiplicity, > > self.reference) > > > class Type(Base): > > __tablename__ = 'Type' > > name = Column(String(50), primary_key=True) > > abstract = Column(Boolean, nullable = False) > > atomic = Column(Boolean, nullable = False) > > subtypes = relationship('Type', > > secondary=inheritance_table, > > primaryjoin=inheritance_table.c.super_name==name, > > secondaryjoin= name == inheritance_table.c.sub_name, > > backref='supertypes') > > members = relationship('Member', > > primaryjoin=Member.of_type_name==name, > > backref='of_type') > > of_members = relationship("Member", > > primaryjoin = Member.type_name == name, > > backref= "type") > > > def isSubOf(self, tp): > > if self == tp: > > return True > > for typ in self.supertypes: > > if typ.isSubOf(tp): return True > > return False > > def addSub(self, tp): > > if tp.atomic: > > raise Exception("type " + tp.name + " cannot have > > supertype") > > if self.isSubOf(tp): > > raise Exception("adding subtype " + tp + "creates cyclic > > inheritance") > > for mem in tp.members: > > self.check(mem.name, mem.type) > > self.subtypes.append(tp) > > def getAll(self): > > out = set(self.members) > > for typ in self.supertypes: > > out.update(typ.getAll()) > > return out > > def getAny(self, name): > > temp = self.getAll() > > for mem in temp: > > if mem.name == name: return mem > > return None > > def hasAny(self, name): > > return self.getAny(name) != None > > def check(self, name, typ, reference): > > if self.atomic: > > raise Exception("atomic type " + self.name + " cannot be > > changed") > > if self.hasAny(name): > > raise Exception("member name " + name + "already exists in > > this type or supertype") > > elif typ.isSubOf(self) and not reference: > > raise Exception("member type " + type.name + " equals this > > type or subtype") > > def add(self, name, type, multiplicity = "one", reference = > > False): > > self.check(name, type, reference) > > self.members.append(Member(name, type, multiplicity, > > reference)) > > def __init__(self, name, atomic = False, abstract = False): > > self.name = name > > self.atomic = atomic > > self.abstract = abstract > > def __repr__(self): > > out = "Type(%r): {" % (self.name) > > for mem in self.members: > > out += str(mem) + ", " > > out += "}" > > return out > > > if __name__ == "__main__": > > engine = create_engine('sqlite:///:memory:', echo=True) > > Base.metadata.drop_all(engine) > > Base.metadata.create_all(engine) > > Session = sessionmaker(bind=engine) > > session = Session() > > try: > > c1 = Type("A") > > c2 = Type("B") > > c1.add("m11", c2) > > session.add(c1) > > session.add(c2) > > session.commit() #<== ERROR > > except Exception, e: > > print "error: " + str(e) > > raise > > > and the error: > > > Traceback (most recent call last): > > File "D:\Documents\Code\Eclipse\workspace\test2\src\metadata.py", > > line 119, in <module> > > session.commit() > > File "C:\python27\lib\site-packages\sqlalchemy\orm\session.py", line > > 614, in commit > > self.transaction.commit() > > File "C:\python27\lib\site-packages\sqlalchemy\orm\session.py", line > > 385, in commit > > self._prepare_impl() > > File "C:\python27\lib\site-packages\sqlalchemy\orm\session.py", line > > 369, in _prepare_impl > > self.session.flush() > > File "C:\python27\lib\site-packages\sqlalchemy\orm\session.py", line > > 1388, in flush > > self._flush(objects) > > File "C:\python27\lib\site-packages\sqlalchemy\orm\session.py", line > > 1469, in _flush > > flush_context.execute() > > File "C:\python27\lib\site-packages\sqlalchemy\orm\unitofwork.py", > > line 302, in execute > > rec.execute(self) > > File "C:\python27\lib\site-packages\sqlalchemy\orm\unitofwork.py", > > line 446, in execute > > uow > > File "C:\python27\lib\site-packages\sqlalchemy\orm\mapper.py", line > > 1878, in _save_obj > > execute(statement, params) > > File "C:\python27\lib\site-packages\sqlalchemy\engine\base.py", line > > 1191, in execute > > params) > > File "C:\python27\lib\site-packages\sqlalchemy\engine\base.py", line > > 1271, in _execute_clauseelement > > return self.__execute_context(context) > > File "C:\python27\lib\site-packages\sqlalchemy\engine\base.py", line > > 1302, in __execute_context > > context.parameters[0], context=context) > > File "C:\python27\lib\site-packages\sqlalchemy\engine\base.py", line > > 1401, in _cursor_execute > > context) > > File "C:\python27\lib\site-packages\sqlalchemy\engine\base.py", line > > 1394, in _cursor_execute > > context) > > File "C:\python27\lib\site-packages\sqlalchemy\engine\default.py", > > line 299, in do_execute > > cursor.execute(statement, parameters) > > sqlalchemy.exc.IntegrityError: (IntegrityError) constraint failed > > u'INSERT INTO "Member" (name, multiplicity, reference, type_name, > > of_type_name) VALUES (?, ?, ?, ?, ?)' ('m11', 'one', 0, 'B', 'A') > > > Please help! > > > -- > > You received this message because you are subscribed to the Google Groups > > "sqlalchemy" group. > > To post to this group, send email to sqlalchemy@googlegroups.com. > > To unsubscribe from this group, send email to > > sqlalchemy+unsubscr...@googlegroups.com. > > For more options, visit this group > > athttp://groups.google.com/group/sqlalchemy?hl=en.
-- You received this message because you are subscribed to the Google Groups "sqlalchemy" group. To post to this group, send email to sqlalchemy@googlegroups.com. To unsubscribe from this group, send email to sqlalchemy+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/sqlalchemy?hl=en.