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.