Получение данных из таблиц имеющих связь многие ко многим postgresql
Входные данные: PostgreSQL. Есть 3 таблицы: products, colors, products_to_colors. Связь такая - каждый продукт может иметь несколько цветов. Каждый цвет может быть у нескольких продуктов. Связь между цветами и продуктами реализована с помощью 3 таблицы products_to_colors.
Поля в таблицах:
- products - два поля:
id,name(остальные не имеют значение, упрощаем задачу =) ) - colors - 2 поля:
id,color(вcolorуказывается сам цвет, например, зелёный) - 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. Возможно такое? Или нужно вручную парсить значения?