Awesome, putting use_alter on one of the foreign keys fixed the problem.

Would it be hard to just assume that when there is a circular
dependency that one of the keys should be use_alter'ed? Is there
actually a case where that be the wrong thing to do (or any reason I
would care which of the keys is the one to have use_alter)?

On Tue, Apr 1, 2008 at 6:54 PM, Michael Bayer <[EMAIL PROTECTED]> wrote:
>
>
>  On Apr 1, 2008, at 5:59 PM, Bobby Impollonia wrote:
>
>  >
>  > This fails (as expected) because of the circular dependency. Before I
>  > switched to declarative, I had solved this by using a
>  > ForeignKeyConstraint with use_alter.
>  > I can't see how to do that with declarative. I tried changing Node2
>  > to:
>
>  ForeignKey takes the use_alter argument as well:
>
>
>  class Node2(Base):
>     __tablename__ = 'node2'
>     id = Column('id', Integer, primary_key=True)
>     parent_node1_id = Column('parent_node1_id', Integer,
>  ForeignKey('node1.id', use_alter=True, name='foo'))
>
>
>
>  >
>  > Also, I think that I have to put the relations outside of the class
>  > definitions (as above) because the primaryjoin arguments references
>  > the class itself. Is there a way around this?
>
>  One way might be to go half the "old" route and create Table objects
>  before you define the classes, setting them on the declarative using
>  "__table__".  then you'd use the table objects for the expressions.
>  This is kind of the reason I've been into datamapper for so long.
>  But, you can actually get pretty wacky with the combination of mapper
>  and declarative.  check this one out:
>
>
>  node1_id = Column('id', Integer, primary_key=True)
>
> node2_id = Column('id', Integer, primary_key=True)
>
>
> class Node1(Base):
>     __tablename__ = 'node1'
>     id = node1_id
>
>     parent_node2_id = Column('parent_node2_id', Integer,
>  ForeignKey('node2.id'))
>     parent_node2 = relation("Node2", primaryjoin = node2_id ==
>
> parent_node2_id, backref = 'children')
>
>
> class Node2(Base):
>     __tablename__ = 'node2'
>     id = node2_id
>
>     parent_node1_id = Column('parent_node1_id', Integer,
>  ForeignKey('node1.id', use_alter=True, name='foo'))
>     parent_node1 = relation("Node1", primaryjoin = node1_id ==
>
> parent_node1_id, backref = 'children')
>
>  metadata.create_all()
>
>  I don't know if the above is the best way to do this but it is very
>  enjoyable.
>
>  Theres various ways, using callables or eval'ed strings, that it can
>  be completely "inlined" even for a bi-directionally-dependent case
>  like this one, but I'm not really sure they're worth it.  The point of
>  declarative is to simplify the large majority of *simple* mappings.
>  If you have a complicated one like this, you have to drop into mapper
>  concepts a little bit.
>
>  >
>

--~--~---------~--~----~------------~-------~--~----~
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 [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/sqlalchemy?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to