ForeignKeyConstraint needs to go into __table_args__ when using declarative.

http://www.sqlalchemy.org/docs/orm/extensions/declarative.html#table-configuration


On Nov 16, 2010, at 6:28 PM, Adrien wrote:

> Hi list,
> 
> Sorry if this is trivial, I'm relatively new to sqlalchemy.
> I'm trying to set a one to many relationship between class Foo and
> class Bar (ie Foo should have a list of Bars). Foo has a composite
> primary key.
> 
> #################################
> from sqlalchemy import *
> from sqlalchemy.orm import *
> from sqlalchemy.ext.declarative  import declarative_base
> 
> 
> Base = declarative_base()
> 
> class Foo(Base):
>    __tablename__ = "foo"
>    one = Column(Integer, primary_key=True)
>    two = Column(Integer, primary_key=True)
> 
> class Bar(Base):
>    __tablename__ = "bar"
>    id = Column(Integer, primary_key=True)
>    one_id = Column(Integer, nullable=False)
>    two_id = Column(Integer, nullable=False)
> 
>    ForeignKeyConstraint(["one_id", "two_id"], ["foo.one", "foo.two"])
>    foo = relationship("Foo", backref = "bars")
> 
> 
> metadata = Base.metadata
> 
> engine = create_engine('sqlite:///:memory:', echo=True)
> metadata.create_all(engine)
> 
> from sqlalchemy.orm import sessionmaker
> 
> # create a configured "Session" class
> Session = sessionmaker(bind=engine)
> 
> # create a Session
> session = Session()
> 
> foo = Foo()
> foo.one = 1
> foo.two = 2
> session.add(foo)
> session.commit()
> #############################
> 
> I get the following message:
> 
> sqlalchemy.exc.ArgumentError: Could not determine join condition
> between parent/child tables on relationship Bar.foo.  Specify a
> 'primaryjoin' expression.
> 
> 
> I tried to change the relationship line to:
> foo = relationship("Foo", backref = "bars", primaryjoin=and_(one_id ==
> Foo.one, two_id==Foo.two ) )
> 
> but then I get this message:
> 
> sqlalchemy.exc.ArgumentError: Could not determine relationship
> direction for primaryjoin condition 'bar.one_id = foo.one AND
> bar.two_id = foo.two', on relationship Bar.foo. Ensure that the
> referencing Column objects have a ForeignKey present, or are otherwise
> part of a ForeignKeyConstraint on their parent Table.
> 
> Thank you for your help!
> 
> -- 
> You received this message because you are subscribed to the Google Groups 
> "sqlalchemy" group.
> To post to this group, send email to sqlalch...@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 sqlalch...@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.

Reply via email to