Hi,

Running SQLAlchemy==1.1.4

I'm getting this

AmbiguousForeignKeysError: Could not determine join condition between 
> parent/child tables on relationship Artifact.slaves - there are multiple 
> foreign key paths linking the tables.  Specify the 'foreign_keys' argument, 
> providing a list of those columns which should be counted as containing a 
> foreign key reference to the parent table.
>

and I'm wondering if I'll have to use primaryjoin= statement instead of 
relying on foreign_keys= to work around this.

The code is shown below. I've included Artifact_Reference for completeness 
but it's probably not needed.

Is the problem on the Artifact_Relation model, or on the Artifact model? 
I'm thinking the later, but I don't see any logical way to specify 
foreign_keys on Artifact as it's on the one side of many to one. 

I'm following this link for Artifact_Relation (i.e. Association 
table) 
http://docs.sqlalchemy.org/en/latest/orm/basic_relationships.html#association-object
 
 where Artifact serves as both the Parent and Child

I'm following this link for multiple-path 
resolution 
http://docs.sqlalchemy.org/en/latest/orm/join_conditions.html#relationship-foreign-keys

Even though Artifact is on both sides of the association, I can't see 
needing to use backref()  w/ remote_id to resolve this, 
ala http://docs.sqlalchemy.org/en/latest/orm/self_referential.html

Thanks for any suggestions..


Base = declarative_base()

class Artifact_Relation(Base):
    __tablename__ = 'artifact_relation'
    master_artifact_id = Column(
        Integer,
        ForeignKey('artifact.id', name='artifact_relation_master_id_fk', 
ondelete="cascade", onupdate="cascade"),
        primary_key=True,
        nullable=False
    )

    slave_artifact_id = Column(
        Integer,
        ForeignKey('artifact.id', name='artifact_relation_slave_id_fk', 
ondelete="cascade", onupdate="cascade"),
        primary_key=True,
        nullable=False
    )

    relationship_type = Column(String(24), nullable=False)

    slave = relationship("Artifact", back_populates="masters", 
foreign_keys=[slave_artifact_id])
    master = relationship("Artifact", back_populates="slaves", 
foreign_keys=[master_artifact_id])

class Artifact(Base):
    "Artifact"
    __tablename__ = 'artifact'
    id = Column('id', Integer, primary_key=True)
    artifact_type = Column('artifact_type', String(16), nullable=False)
    __mapper_args__ = {
        'polymorphic_on': artifact_type
    }

    artifact_references = relationship(
        'Artifact_Reference',
        back_populates='artifact',
        cascade="all, delete-orphan",
        passive_deletes=True
    )

    slaves = relationship("Artifact_Relation", back_populates="master")
    masters = relationship("Artifact_Relation", back_populates="slave")

class Artifact_Reference(Base):
    """Artifact_Reference"""
    __tablename__ = 'artifact_reference'
    id = Column('id', Integer, primary_key=True)
    type = Column('type', String(24), nullable=False)
    artifact_id = Column('artifact_id', Integer, ForeignKey(Artifact.id, 
name="artifact_reference_artifact_id_fk", ondelete="cascade", 
onupdate="cascade"), nullable=False)
    reference = Column('reference', String(64), nullable=False)

    artifact = relationship(
        Artifact,
        back_populates='artifact_references'
    )
    Index('reference_idx', reference, unique=False)


 


-- 
SQLAlchemy - 
The Python SQL Toolkit and Object Relational Mapper

http://www.sqlalchemy.org/

To post example code, please provide an MCVE: Minimal, Complete, and Verifiable 
Example.  See  http://stackoverflow.com/help/mcve for a full description.
--- 
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to sqlalchemy+unsubscr...@googlegroups.com.
To post to this group, send email to sqlalchemy@googlegroups.com.
Visit this group at https://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/d/optout.

Reply via email to