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.