Re: [sqlalchemy] CircularDependencyError with relationships

2012-06-06 Thread Michael Bayer
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

2012-06-06 Thread Alex Grönholm

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

2012-06-05 Thread Alex Grönholm
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.