On Sep 7, 2011, at 12:36 PM, Erkan Özgür Yılmaz wrote: > 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).
According to the error message, TaskableEntity has a foreign key to Projects and Projects has a foreign key to TaskableEntity, thus creating a cycle. TaskableEntity would appear to have this Project foreign key via the ProjectMixin class. So I'd add a use_alter=True to one of those ForeignKey objects. > > 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. -- 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.