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 at http://groups.google.com/group/sqlalchemy?hl=en.