Peewee SQL - Как использовать Python any () и все () операторы в запросе - PullRequest
0 голосов
/ 07 марта 2020

Мне нужна помощь в выполнении одного запроса, объединяющего несколько таблиц (многие-ко-многим), однако я хочу включить Peewee PostgreSQL, эквивалентный Python операторам any () и all ().

Схема

  • Почта: id, имя_почты
  • Метка: id, tag_name
  • Автор: id, имя_пользователя
  • Post_Tags: post_id, tag_id
  • Post_Authors: post_id, author_id

Запрос

С учетом списка из нескольких имен тегов и список нескольких имен авторов, я хочу, чтобы все сообщения, которые имеют ЛЮБОЙ тег, который соответствует И имеют ВСЕХ авторов, которые соответствуют:

Пример

tag_list = [“Politics”, “Economy”]
author_list = [“Sarah”, “Alex”]

Запрос вернет все сообщения, которые имеют хотя бы один тег «Политика» или «Экономика» И имеют в качестве авторов «Сара» и / или «Алекс». Однако, если авторами сообщения являются "Сара" и "Кристина", это сообщение НЕ должно отображаться.

Это мой текущий запрос, но он не удовлетворяет всем моим условиям:

query = Post
.select()
.join(PostTags)
.join(Tag)
.switch(Post)
.join(PostAuthors)
.join(Authors)
.where((Tag.name << tag_list) & (Author.name << author_list))

Однако мне все еще нужно перебрать свой запрос для выполнения sh того, что мне нужно:

filtered_posts = []

for post in query:
    if all(author.name in author_list for author in post.authors):
        filtered_posts.append(post)

Какие-нибудь советы по оптимизации моего запроса в Peewee? Заранее спасибо!

1 Ответ

1 голос
/ 09 марта 2020

Вы можете использовать группирование / необходимость убедиться, что количество совпавших авторов равно количеству вводимых вами, а количество тегов больше или равно 1. Вы также можете разделить запросы и выполнить UNION или INTERSECT.

Помощник SQL "EXISTS" может быть полезен для части тегов вашего запроса, если вы хотите использовать подзапрос, а не JOIN.

...