Я использую свойства столбца для ссылки на свойства других таблиц. Я хотел бы иметь возможность выбирать произвольную информацию из других моделей независимо от порядка объявления моделей. Точно так же, как 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()