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_baseBase = 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 = addresscompany.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.