Какова цель точки между соединениями sqlalchemy? - PullRequest
0 голосов
/ 06 октября 2018

Я пытаюсь понять этот раздел документации SQLAlchemy по составным вторичным соединениям .Между двумя соединениями есть оператор точки, который выглядит так, будто я ожидал, что это будет запятая.Я думаю, если это не опечатка, это может быть оператор пересечения, но я не знаю.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 голосов
/ 06 октября 2018

Многие из аргументов для relationship могут быть переданы как вызываемая или Python-вычисляемая строка для отложенной оценки во время инициализации mapper.Если это строка, она оценивается в контексте, который включает имена из метаданных и реестра декларативных классов, а также пакет sqlalchemy - подробности см. "Настройка отношений" .Это позволяет, например, нарушать некоторые циклические зависимости во время создания класса и т. Д.

Ваш аргумент secondary представляет собой такую ​​строку, разбитую на две строки.По сути, это так, как если бы вы использовали выражение

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

в качестве аргумента (оценивается в будущем), что должно привести к его правильному выводу: точка - это просто точка из атрибута ссылка .Первый объект соединения далее соединяется с C, в результате чего

B JOIN D ON B.d_id = D.id JOIN C ON C.d_id = D.id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...