The following gives CircularDependencyError where I think there isn't, but you know I don't know that much the internals of SQLAlchemy and maybe (and it is a strong possibility) I'm wrong. I've ripped of the classes causing the error (copy/paste will re-produce the error).
from sqlalchemy import orm, create_engine from sqlalchemy.orm import relationship, synonym, validates from sqlalchemy import (Table, Column, ForeignKey, Boolean, Integer, String) from sqlalchemy.ext.declarative import (declarative_base, synonym_for, declared_attr) Base = declarative_base() ######################################################################## class SimpleEntity(Base): __tablename__ = "SimpleEntities" id = Column("id", Integer, primary_key=True) entity_type = Column("db_entity_type", String(128), nullable=False) __mapper_args__ = { "polymorphic_on": entity_type, "polymorphic_identity": "SimpleEntity", } ######################################################################## class Entity(SimpleEntity): __tablename__ = "Entities" __mapper_args__ = {"polymorphic_identity": "Entity"} entity_id = Column("id", Integer, ForeignKey("SimpleEntities.id"), primary_key=True) ######################################################################## class Task(Entity): __tablename__ = "Tasks" __mapper_args__ = {"polymorphic_identity": "Task"} task_id = Column("id", Integer, ForeignKey("Entities.id"), primary_key=True) task_of_id = Column(Integer, ForeignKey("TaskableEntities.id")) ######################################################################## class ProjectMixin(object): #---------------------------------------------------------------------- @declared_attr def project_id(cls): return Column( "project_id", Integer, ForeignKey("Projects.id"), ) #---------------------------------------------------------------------- @declared_attr def project(cls): return relationship( "Project", primaryjoin=\ cls.__name__ + ".project_id==Project.project_id_local", post_update=True, # for project itself uselist=False ) #---------------------------------------------------------------------- def __init__(self, project=None, **kwargs): self.project = project ######################################################################## class TaskableEntity(Entity, ProjectMixin): __tablename__ = "TaskableEntities" __mapper_args__ = {"polymorphic_identity": "TaskableEntity"} taskableEntity_id = Column("id", Integer, ForeignKey("Entities.id"), primary_key=True) tasks = relationship( "Task", primaryjoin=taskableEntity_id==Task.task_of_id, backref="task_of", post_update=True, ) ######################################################################## class Project(TaskableEntity): __tablename__ = "Projects" project_id_local = Column("id", Integer, ForeignKey("TaskableEntities.id"), primary_key=True) __mapper_args__ = {"polymorphic_identity": "Project", "inherit_condition": project_id_local==TaskableEntity.taskableEntity_id} engine = create_engine("sqlite:///:memory:") Base.metadata.create_all(engine) Session = sqlalchemy.orm.sessionmaker(bind=dengine) session = Session() The Error message: sqlalchemy.exc.CircularDependencyError: Circular dependency detected: cycles: set([ Table('TaskableEntities', MetaData(None), Column('id', Integer(), ForeignKey('Entities.id'), table=<TaskableEntities>, primary_key=True, nullable=False), Column('project_id', Integer(), ForeignKey('Projects.id'), table=<TaskableEntities>), schema=None), Table('Projects', MetaData(None), Column('id', Integer(), ForeignKey('TaskableEntities.id'), table=<Projects>, primary_key=True, nullable=False), schema=None)] ) all edges: set( [ (Table('TaskableEntities', MetaData(None), Column('id', Integer(), ForeignKey('Entities.id'), table=<TaskableEntities>, primary_key=True, nullable=False), Column('project_id', Integer(), ForeignKey('Projects.id'), table=<TaskableEntities>), schema=None), Table('Projects', MetaData(None), Column('id', Integer(), ForeignKey('TaskableEntities.id'), table=<Projects>, primary_key=True, nullable=False), schema=None)), (Table('SimpleEntities', MetaData(None), Column('id', Integer(), table=<SimpleEntities>, primary_key=True, nullable=False), Column('db_entity_type', String(length=128), table=<SimpleEntities>, nullable=False), schema=None), Table('Entities', MetaData(None), Column('id', Integer(), ForeignKey('SimpleEntities.id'), table=<Entities>, primary_key=True, nullable=False), schema=None)), (Table('TaskableEntities', MetaData(None), Column('id', Integer(), ForeignKey('Entities.id'), table=<TaskableEntities>, primary_key=True, nullable=False), Column('project_id', Integer(), ForeignKey('Projects.id'), table=<TaskableEntities>), schema=None), Table('Tasks', MetaData(None), Column('id', Integer(), ForeignKey('Entities.id'), table=<Tasks>, primary_key=True, nullable=False), Column('task_of_id', Integer(), ForeignKey('TaskableEntities.id'), table=<Tasks>), schema=None)), (Table('Entities', MetaData(None), Column('id', Integer(), ForeignKey('SimpleEntities.id'), table=<Entities>, primary_key=True, nullable=False), schema=None), Table('Tasks', MetaData(None), Column('id', Integer(), ForeignKey('Entities.id'), table=<Tasks>, primary_key=True, nullable=False), Column('task_of_id', Integer(), ForeignKey('TaskableEntities.id'), table=<Tasks>), schema=None)), (Table('Entities', MetaData(None), Column('id', Integer(), ForeignKey('SimpleEntities.id'), table=<Entities>, primary_key=True, nullable=False), schema=None), Table('TaskableEntities', MetaData(None), Column('id', Integer(), ForeignKey('Entities.id'), table=<TaskableEntities>, primary_key=True, nullable=False), Column('project_id', Integer(), ForeignKey('Projects.id'), table=<TaskableEntities>), schema=None)), (Table('Projects', MetaData(None), Column('id', Integer(), ForeignKey('TaskableEntities.id'), table=<Projects>, primary_key=True, nullable=False), schema=None), Table('TaskableEntities', MetaData(None), Column('id', Integer(), ForeignKey('Entities.id'), table=<TaskableEntities>, primary_key=True, nullable=False), Column('project_id', Integer(), ForeignKey('Projects.id'), table=<TaskableEntities>), schema=None)) ] ) E.Ozgur Yilmaz Lead Technical Director eoyilmaz.blogspot.com -- 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.