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.

Reply via email to