sqlalchemy联接之间的点的目的是什么

时间:2018-10-06 14:46:05

标签: python sqlalchemy

我正试图了解this section of the SQLAlchemy documentation on Composite Secondary Joins。在两个联接之间有一个点运算符,看来我希望它是一个逗号。我在想,如果不是错字,可能是路口算子,但我不知道。 secondary="join(B, D, B.d_id == D.id)."是一行。如您所见,双引号前面有一个圆点。

该点的作用是什么?

我提取以下代码

    d = relationship("D",
                secondary="join(B, D, B.d_id == D.id)."  ### <-- What is this dot doing?
                            "join(C, C.d_id == D.id)",
                primaryjoin="and_(A.b_id == B.id, A.id == C.a_id)",
                secondaryjoin="D.id == B.d_id",
                uselist=False
                )

完整代码在这里:

class A(Base):
    __tablename__ = 'a'

    id = Column(Integer, primary_key=True)
    b_id = Column(ForeignKey('b.id'))

    d = relationship("D",
                secondary="join(B, D, B.d_id == D.id)."
                            "join(C, C.d_id == D.id)",
                primaryjoin="and_(A.b_id == B.id, A.id == C.a_id)",
                secondaryjoin="D.id == B.d_id",
                uselist=False
                )

class B(Base):
    __tablename__ = 'b'

    id = Column(Integer, primary_key=True)
    d_id = Column(ForeignKey('d.id'))

class C(Base):
    __tablename__ = 'c'

    id = Column(Integer, primary_key=True)
    a_id = Column(ForeignKey('a.id'))
    d_id = Column(ForeignKey('d.id'))

class D(Base):
    __tablename__ = 'd'

    id = Column(Integer, primary_key=True)

1 个答案:

答案 0 :(得分:1)

relationship的许多参数可以作为可调用字符串或Python可评估字符串传递,以便在映射器初始化时进行惰性评估。如果是字符串,则在包含元数据和声明性类注册表中的名称以及sqlalchemy包的上下文中对其进行评估–有关详细信息,请参见"Configuring Relationships"。例如,这允许在类构造过程中打破一些循环依赖等。

您的secondary参数就是这样一个字符串,分为两行。基本上就像您已经使用表达式

join(B, D, B.d_id == D.id).join(C, C.d_id == D.id)

作为参数(将在以后进行评估),应立即将其清除:点只是attribute reference中的点。第一个联接对象进一步与C联接,结果

B JOIN D ON B.d_id = D.id JOIN C ON C.d_id = D.id