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 [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.
> 

-- 
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.

Reply via email to