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.