SQLAlchemy lazy sa.select ([]) - PullRequest
       20

SQLAlchemy lazy sa.select ([])

0 голосов
/ 21 февраля 2020

Я использую свойства столбца для ссылки на свойства других таблиц. Я хотел бы иметь возможность выбирать произвольную информацию из других моделей независимо от порядка объявления моделей. Точно так же, как sa.orm.relationship объявляет свое отношение в виде строк.

Проблема, с которой я сталкиваюсь, заключается в том, что property_of_a не может быть инициализирован, потому что ModelB не объявлен в этот момент.

Здесь это упрощенный (не работающий) пример.

Рабочая альтернатива для этого примера может использовать sa.ext.associationproxy Я не думаю, что я могу использовать прокси-серверы ассоциации, потому что я хотел бы чтобы иметь возможность использовать CONCAT, GROUP_CONCAT и IF-THEN-ELSE Запросы.

Есть ли способ инициализировать запрос sa.select, ленивый (например, такими строками, как sa.orm.relationship)

import sqlalchemy as sa

Base = sa.ext.declarative.declarative_base()
metadata = Base.metadata

class ModelA(Base):
  __tablename__ = "model_a_table"

  id = sa.Column(sa.Integer, primary_key=True)
  name = sa.Column(sa.String(255), nullable=False, unique=True)

  model_b_id = sa.Column(sa.ForeignKey('model_b_table.id', ondelete='SET NULL'), index=True)
  model_b = sa.orm.relationship("ModelB")

  property_of_a = sa.orm.column_property(sa.select([ModelB.name]).where(ModelB.id == model_b_id))

class ModelB(Base):
  __tablename__ = "model_b_table"

  id = sa.Column(sa.Integer, primary_key=True)
  name = sa.Column(sa.String(255), nullable=False, unique=True)

  model_a_id = sa.Column(sa.ForeignKey('model_a_table.id', ondelete='SET NULL'), index=True)
  model_b = sa.orm.relationship("ModelA")

  property_of_b = sa.orm.column_property(sa.select([ModelA.name]).where(ModelB.id == model_a_id))

sa.orm.configure_mappers()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...