SQLAlchemy: выберите только некоторые поля, включая значение из псевдонима объединения, и дайте им произвольные имена? - PullRequest
0 голосов
/ 19 февраля 2020

Вот текущий запрос.

likes = sqlalchemy.orm.aliased(Counter)
q = Video.query()

q = q.filter(Video.lifecycle_status == "created")
q = q.filter(Video.release_status == "public")

tags = dict(role="video", format="hls")
for name, value in tags.items():
    tag = sqlalchemy.orm.aliased(VideoMaterialTag)
    q = q.join(Video.materials)
    q = q.join(tag, VideoMaterial.tags)
    q = q.filter(tag.name == name)
    q = q.filter(tag.value == value)

q = q.outerjoin(
    likes,
    (likes.table_name == "tungsten_video")
    & (likes.row_id == Video.id)
    & (likes.name == "videos_public"),
)

q = q.order_by(likes.value.desc().nullslast())
q = q.distinct()

q = q.options(
    sqlalchemy.orm.joinedload(Video.creator)
    .load_only("id", "username", "avatar")
)
q = q.options(
    sqlalchemy.orm.joinedload(Video.song)
    .load_only("id", "title")
)
q = q.options(
    sqlalchemy.orm.joinedload(Video.materials)
    .load_only("file")
    .joinedload(VideoMaterial.tags)
    .load_only("name", "value")
)

Этот код работает очень хорошо, но я борюсь с этими моментами.

  • В настоящее время он выбирает все поля из Модель видео, я хотел бы выбрать только id и role.
  • Я также хотел бы выбрать likes.value, а имя num_likes.

Я попытался заменить вторую строку этим.

q = Video.query(Video.id, Video.role, likes.value.label("num_likes"))

Но это приводит к трассировке стека, которая заканчивается следующим образом.

  File "/home/thnee/.python-venvs/platinum/lib/python3.6/site-packages/sqlalchemy/orm/strategy_options.py", line 885, in _find_entity_prop_comparator
    % (util.clsname_as_plain_name(type(prop)), prop)
sqlalchemy.exc.ArgumentError: Query has only expression-based entities, which do not apply to relationship property "Video.creator"

Я попытался добавить эту строку.

q = q.options(sqlalchemy.orm.load_only("id", "role", likes.value.label("num_likes")))

Но это приводит к трассировке стека, которая заканчивается следующим образом.

  File "/home/thnee/.python-venvs/platinum/lib/python3.6/site-packages/sqlalchemy/sql/elements.py", line 522, in __bool__
    raise TypeError("Boolean value of this clause is not defined")
TypeError: Boolean value of this clause is not defined
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...