Re: [sqlalchemy] CircularDependencyError with relationships
you need to use the post_update option described at http://docs.sqlalchemy.org/en/rel_0_7/orm/relationships.html#rows-that-point-to-themselves-mutually-dependent-rows . On Jun 6, 2012, at 1:15 AM, Alex Grönholm wrote: I have trouble configuring two relationships from one class to another. The following code should be fairly self-explanatory: from sqlalchemy import * from sqlalchemy.orm import * from sqlalchemy.ext.declarative import declarative_base Base = declarative_base() class Company(Base): __tablename__ = 'companies' id = Column(Integer, primary_key=True) default_address_id = Column(Integer, ForeignKey('addresses.id', use_alter=True, name='defaultaddress_fk')) addresses = relationship('Address', backref='company', primaryjoin='Address.company_id == Company.id') default_address = relationship('Address', primaryjoin='Company.default_address_id == Address.id') class Address(Base): __tablename__ = 'addresses' id = Column(Integer, primary_key=True) company_id = Column(Integer, ForeignKey(Company.id), nullable=False) engine = create_engine('sqlite:///', echo=True) Base.metadata.create_all(engine) session = Session(engine) company = Company() address = Address() session.add(company) company.default_address = address company.addresses.append(address) session.flush() What I expect is SQLAlchemy to 1) create the company, 2) create the address with the new company's id in company_id, 3) assign the ID of the new address to company.default_address_id Trouble is, I get this error: sqlalchemy.exc.CircularDependencyError: Circular dependency detected. Cycles: set([ProcessState(ManyToOneDP(Company.default_address), Company at 0x16a7210, delete=False), ProcessState(ManyToOneDP(Address.company), Address at 0x16ad190, delete=False), SaveUpdateState(Company at 0x16a7210), ProcessState(OneToManyDP(Company.addresses), Company at 0x16a7210, delete=False), SaveUpdateState(Address at 0x16ad190)]) all edges: set([(ProcessState(OneToManyDP(Company.addresses), Company at 0x16a7210, delete=False), SaveUpdateState(Address at 0x16ad190)), (SaveUpdateState(Address at 0x16ad190), ProcessState(ManyToOneDP(Company.default_address), Company at 0x16a7210, delete=False)), (SaveUpdateState(Company at 0x16a7210), SaveUpdateState(Address at 0x16ad190)), (SaveUpdateState(Company at 0x16a7210), ProcessState(ManyToOneDP(Address.company), Address at 0x16ad190, delete=False)), (ProcessState(ManyToOneDP(Company.default_address), Company at 0x16a7210, delete=False), SaveUpdateState(Company at 0x16a7210)), (ProcessState(ManyToOneDP(Address.company), Address at 0x16ad190, delete=False), SaveUpdateState(Address at 0x16ad190)), (SaveUpdateState(Company at 0x16a7210), ProcessState(OneToManyDP(Company.addresses), Company at 0x16a7210, delete=False))]) What am I doing wrong? I had a similar problem in my production app when trying to delete a Company that had a default address assigned. I'm on SQLAlchemy 0.7.7. -- You received this message because you are subscribed to the Google Groups sqlalchemy group. To view this discussion on the web visit https://groups.google.com/d/msg/sqlalchemy/-/fqFKTLBdTYwJ. 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.
Re: [sqlalchemy] CircularDependencyError with relationships
06.06.2012 18:06, Michael Bayer kirjoitti: you need to use the post_update option described at http://docs.sqlalchemy.org/en/rel_0_7/orm/relationships.html#rows-that-point-to-themselves-mutually-dependent-rows . Thanks for the pointer. Problem solved :) On Jun 6, 2012, at 1:15 AM, Alex Grönholm wrote: I have trouble configuring two relationships from one class to another. The following code should be fairly self-explanatory: from sqlalchemy import * from sqlalchemy.orm import * from sqlalchemy.ext.declarative import declarative_base Base = declarative_base() class Company(Base): __tablename__ = 'companies' id = Column(Integer, primary_key=True) default_address_id = Column(Integer, ForeignKey('addresses.id', use_alter=True, name='defaultaddress_fk')) addresses = relationship('Address', backref='company', primaryjoin='Address.company_id == Company.id') default_address = relationship('Address', primaryjoin='Company.default_address_id == Address.id') class Address(Base): __tablename__ = 'addresses' id = Column(Integer, primary_key=True) company_id = Column(Integer, ForeignKey(Company.id), nullable=False) engine = create_engine('sqlite:///', echo=True) Base.metadata.create_all(engine) session = Session(engine) company = Company() address = Address() session.add(company) company.default_address = address company.addresses.append(address) session.flush() What I expect is SQLAlchemy to 1) create the company, 2) create the address with the new company's id in company_id, 3) assign the ID of the new address to company.default_address_id Trouble is, I get this error: sqlalchemy.exc.CircularDependencyError: Circular dependency detected. Cycles: set([ProcessState(ManyToOneDP(Company.default_address), Company at 0x16a7210, delete=False), ProcessState(ManyToOneDP(Address.company), Address at 0x16ad190, delete=False), SaveUpdateState(Company at 0x16a7210), ProcessState(OneToManyDP(Company.addresses), Company at 0x16a7210, delete=False), SaveUpdateState(Address at 0x16ad190)]) all edges: set([(ProcessState(OneToManyDP(Company.addresses), Company at 0x16a7210, delete=False), SaveUpdateState(Address at 0x16ad190)), (SaveUpdateState(Address at 0x16ad190), ProcessState(ManyToOneDP(Company.default_address), Company at 0x16a7210, delete=False)), (SaveUpdateState(Company at 0x16a7210), SaveUpdateState(Address at 0x16ad190)), (SaveUpdateState(Company at 0x16a7210), ProcessState(ManyToOneDP(Address.company), Address at 0x16ad190, delete=False)), (ProcessState(ManyToOneDP(Company.default_address), Company at 0x16a7210, delete=False), SaveUpdateState(Company at 0x16a7210)), (ProcessState(ManyToOneDP(Address.company), Address at 0x16ad190, delete=False), SaveUpdateState(Address at 0x16ad190)), (SaveUpdateState(Company at 0x16a7210), ProcessState(OneToManyDP(Company.addresses), Company at 0x16a7210, delete=False))]) What am I doing wrong? I had a similar problem in my production app when trying to delete a Company that had a default address assigned. I'm on SQLAlchemy 0.7.7. -- You received this message because you are subscribed to the Google Groups sqlalchemy group. To view this discussion on the web visit https://groups.google.com/d/msg/sqlalchemy/-/fqFKTLBdTYwJ. To post to this group, send email to sqlalchemy@googlegroups.com mailto:sqlalchemy@googlegroups.com. To unsubscribe from this group, send email to sqlalchemy+unsubscr...@googlegroups.com mailto: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. -- 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.
[sqlalchemy] CircularDependencyError with relationships
I have trouble configuring two relationships from one class to another. The following code should be fairly self-explanatory: from sqlalchemy import * from sqlalchemy.orm import * from sqlalchemy.ext.declarative import declarative_base Base = declarative_base() class Company(Base): __tablename__ = 'companies' id = Column(Integer, primary_key=True) default_address_id = Column(Integer, ForeignKey('addresses.id', use_alter=True, name='defaultaddress_fk')) addresses = relationship('Address', backref='company', primaryjoin='Address.company_id == Company.id') default_address = relationship('Address', primaryjoin='Company.default_address_id == Address.id') class Address(Base): __tablename__ = 'addresses' id = Column(Integer, primary_key=True) company_id = Column(Integer, ForeignKey(Company.id), nullable=False) engine = create_engine('sqlite:///', echo=True) Base.metadata.create_all(engine) session = Session(engine) company = Company() address = Address() session.add(company) company.default_address = address company.addresses.append(address) session.flush() What I expect is SQLAlchemy to 1) create the company, 2) create the address with the new company's id in company_id, 3) assign the ID of the new address to company.default_address_id Trouble is, I get this error: sqlalchemy.exc.CircularDependencyError: Circular dependency detected. Cycles: set([ProcessState(ManyToOneDP(Company.default_address), Company at 0x16a7210, delete=False), ProcessState(ManyToOneDP(Address.company), Address at 0x16ad190, delete=False), SaveUpdateState(Company at 0x16a7210), ProcessState(OneToManyDP(Company.addresses), Company at 0x16a7210, delete=False), SaveUpdateState(Address at 0x16ad190)]) all edges: set([(ProcessState(OneToManyDP(Company.addresses), Company at 0x16a7210, delete=False), SaveUpdateState(Address at 0x16ad190)), (SaveUpdateState(Address at 0x16ad190), ProcessState(ManyToOneDP(Company.default_address), Company at 0x16a7210, delete=False)), (SaveUpdateState(Company at 0x16a7210), SaveUpdateState(Address at 0x16ad190)), (SaveUpdateState(Company at 0x16a7210), ProcessState(ManyToOneDP(Address.company), Address at 0x16ad190, delete=False)), (ProcessState(ManyToOneDP(Company.default_address), Company at 0x16a7210, delete=False), SaveUpdateState(Company at 0x16a7210)), (ProcessState(ManyToOneDP(Address.company), Address at 0x16ad190, delete=False), SaveUpdateState(Address at 0x16ad190)), (SaveUpdateState(Company at 0x16a7210), ProcessState(OneToManyDP(Company.addresses), Company at 0x16a7210, delete=False))]) What am I doing wrong? I had a similar problem in my production app when trying to delete a Company that had a default address assigned. I'm on SQLAlchemy 0.7.7. -- You received this message because you are subscribed to the Google Groups sqlalchemy group. To view this discussion on the web visit https://groups.google.com/d/msg/sqlalchemy/-/fqFKTLBdTYwJ. 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.