Arhn - архитектура программирования

Есть ли способ объединить несколько запросов и добавить столбец к данным, представляющим собой массив запросов, из которых были получены данные?

Редактировать 1: до сих пор я придумал следующую SQLAlchemy в тестировании, но мне все еще нужно выяснить, как добавить к ней окончательный SELECT, который помещает данные в форму, которую я хочу. Любые идеи?

query1 = db.session.query(literal_column("'first_name'").label("matches"), models.User.id).filter(models.User.first_name == 'Joe')
query2 = db.session.query(literal_column("'last_name'").label("matches"), models.User.id).filter(models.User.last_name == 'Su')

union = db.union_all(query1, query2)
results = db.session.query(db.alias(union, name='users')).all()

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

Основной вопрос заключается в том, как я могу взять несколько меньших запросов в таблицу и объединить их, чтобы в результирующих данных был столбец (с данными, которые он содержит, скорее всего, массив), который представляет собой список запросов, которые вернули тот же объект.

Например, если у меня есть таблица Users со следующими данными

id | first_name | last_name | age
1  |Joe         | Shmoe     | 39
2  |Marry       | Su        | 63
3  |Frank       | Su        | 39

и у меня есть следующие запросы (используя SQL для простоты, но это должно закончиться использованием кода стиля PostgreSQL ORM)

Select * from Users where first_name = "Joe"; 
 - resulting Ids: 1
Select * from Users where last_name = "Su";
 - resultings Ids: 2,3
Select * from Users where age ="39";
 - resulting Ids: 1,3

Объединенный запрос должен заканчиваться

id | first_name | last_name | age | matches
1  | Joe        | Shmoe     | 39  | ['first_name', 'age']
2  | Marry      | Su        | 63  | ['last_name']
3  | Frank      | Su        | 39  | ['last_name', 'age']

Если это возможно, как это сделать?
Также на заметку. Я хотел бы иметь возможность конкретно маркировать то, что идет на спички. Например, я мог бы пометить первый запрос как 'first_name', как в моем примере, или сделать его 'firstName' или 'Dude', или как угодно.

30.03.2020

Ответы:


1

Это один из способов сделать это:

select id, first_name, last_name, age, array_agg(m) matches from (
    select 'first_name'::text m, * from users where first_name = 'Joe'
    union all
    select 'last_name'::text m, * from users where last_name = 'Su'
    union all
    select 'age'::text m, * from users where age ='39'
)   d 
group by id, first_name, last_name, age;
30.03.2020

2

Это то, что я, наконец, придумал. Не знаю, лучшее ли это решение, но оно работает.

queries = []
queries.append(db.session.query(literal_column("'first_name'").label("m"), models.User.id.label('id')).filter(models.User.first_name == 'Joe'))
queries.append(db.session.query(literal_column("'last_name'").label("m"), models.User.id.label('id')).filter(models.User.last_name == 'Su'))


union = db.union_all(*queries)
alias = db.alias(union, name='users')

query_results = db.session.query(alias.c.id, func.array_agg(alias.c.m)).group_by('users.id').all()
results = []
for result in query_results:
    results.append({'id':result[0], 'matches': result[1]})
30.03.2020
Новые материалы

Коллекции публикаций по глубокому обучению
Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

Представляем: Pepita
Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

Советы по коду Laravel #2
1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

3 способа решить квадратное уравнение (3-й мой любимый) -
1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

Создание VR-миров с A-Frame
Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

Демистификация рекурсии
КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..