Получение данных из таблиц имеющих связь многие ко многим postgresql

Входные данные: PostgreSQL. Есть 3 таблицы: products, colors, products_to_colors. Связь такая - каждый продукт может иметь несколько цветов. Каждый цвет может быть у нескольких продуктов. Связь между цветами и продуктами реализована с помощью 3 таблицы products_to_colors.

Поля в таблицах:

  1. products - два поля: id, name (остальные не имеют значение, упрощаем задачу =) )
  2. colors - 2 поля: id, colorcolor указывается сам цвет, например, зелёный)
  3. products_to_colors - 3 поля: id, color_id, product_id (поле id наверное тут лишнее, хз зачем я его сделал)

Задача: Скорее всего это избитый вопрос и уже кучу постов с подобными вопросами. Но у меня не получилось ничего найти. Задача состоит в том, чтобы одним запросом к БД получить все данные из этих 3 таблиц. Использую python3 и asyncpg (asyncpg - асинхронный postgres для python, можно делать на примере psycopg2, я разберусь). Нашёл статью, как это делается в mysql, попытался адаптировать к postgres:

SELECT products.*, string_agg(colors(color), ',')
FROM products
LEFT JOIN products_to_colors ON products.id = products_to_colors.product_id
LEFT JOIN colors ON colors.id = products_to_colors.color_id;

Получаю ошибку:

ERROR:  function colors(character varying) does not exist
LINE 1: SELECT products.*, string_agg(colors(color), ',')
                                      ^
HINT:  No function matches the given name and argument types. You might need to add explicit type casts.

Не понимаю, что хочет от меня postgres и как исправить ошибку

Ещё 1 вопрос: Также, если я правильно понимаю, то значение colors вернётся мне в виде строки, где значения будут разделены запятыми. Хотелось бы, что это был объект списка python. Возможно такое? Или нужно вручную парсить значения?


Ответы (0 шт):