我正试图了解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)
答案 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