172 похожих чатов

Как можно создать массив объектов в postgres?

41 ответов

35 просмотров

select array[*список объектов*]::*нужный тип данных*[] select array_agg(*поле для агрегации* order by *поле для сортировки*)::*нужный тип данных*[] select array(select ...*подзапрос для агрегации*)::*нужный тип данных*[]

postgres=# select '{1, 2, 3}'::int[]; int4 --------- {1,2,3} (1 строка) про это спрашиваешь?

Desalutar- Автор вопроса
anton potapov
postgres=# select '{1, 2, 3}'::int[]; int4 --...

Есть таблица orders, там есть столбец products типа order_product[], тип создал таким образом CREATE TYPE order_product AS (id INTEGER,image TEXT,title TEXT,price NUMERIC(10, 0),color TEXT,size TEXT,count INTEGER); Теперь при попытке вставить данные в столбец products получаю ошибку

Desalutar
Есть таблица orders, там есть столбец products тип...

Показывай DDL таблицы orders, запрос и текст ошибки

Почему картинками

Desalutar
Есть таблица orders, там есть столбец products тип...

Опиши исходную задачу, зачем тебе в одной таблице массив со строками из другой

Максим Мартынов
Почему картинками

(id SERIAL PRIMARY KEY, orders CREATE TABLE IF NOT EXISTS user id INTEGER NOT NULL REFERENCES Tsers (id), products order product [ ] NOT NULL, INTEGER NOT delivery fee NULL DEFAULT 0, total INTEGER NOT NULL) ; :) На маке картинки не проблема. :))

Desalutar- Автор вопроса
Максим Мартынов
Почему картинками

Создание таблицы -CREATE TABLE IF NOT EXISTS orders (id SERIAL PRIMARY KEY, user_id INTEGER NOT NULL REFERENCES users(id), products order_product[] NOT NULL, delivery_fee INTEGER NOT NULL DEFAULT 0, total INTEGER NOT NULL); Вставка данных(в node js) - 'INSERT INTO orders (user_id, products, delivery_fee, total) VALUES ($1, $2, $3, $4) RETURNING * ;', [ req.user.userId, orderProducts, 15, total, ]

Неъматжон
(id SERIAL PRIMARY KEY, orders CREATE TABLE IF NOT...

Для нормальных айтишников — проблема.

Неъматжон
(id SERIAL PRIMARY KEY, orders CREATE TABLE IF NOT...

Можэшь внимательно прочитать картинку и сравнить со своим текстом.

Desalutar
Создание таблицы -CREATE TABLE IF NOT EXISTS order...

one2many делается не так. Это строки в order_products должны ссылаться на orders.id, не наоборот. Это тебе не вложенные объекты

Desalutar
Создание таблицы -CREATE TABLE IF NOT EXISTS order...

insert into orders_test (products) values ( ARRAY[(1,'test', 'test', 1.1, 'test', 'test', 1)]::order_product_test[] ); вот так работает insert

Неъматжон
Уже… Мак дурак… :)

Кое-что в принцыпе потеряется в большынстве картинок (разница с и c, например).

Desalutar
Создание таблицы -CREATE TABLE IF NOT EXISTS order...

По моему, скобки фигурные должны быть.

Desalutar
Создание таблицы -CREATE TABLE IF NOT EXISTS order...

При вставки скобки фигурыми должны быть.. по моему..

Desalutar
Создание таблицы -CREATE TABLE IF NOT EXISTS order...

>Вставка данных(в node js) - Попытка выполнить эту строку в js вызовет ошыбку синтаксиса. Приводите ДОСТАТОЧНО ПОЛНЫЙ текст процэдуры, чтобы было понятно — чем вы там занимаетесь. Все переменные, последние присвоения им, вызовы, относящиеся к переменным и базе данных. И все importы, которые нужны — чтобы было понятно, какие библиотеки используете. Лучшэ было бы, конечно, минимальный воспроизводимый пример — но это ладно, это понятно, это трудиться надо чтобы сделать. Это потом, если не поймём как выяснить вашы проблемы.

Desalutar- Автор вопроса

вот полная запись вставки const order = await db.query( 'INSERT INTO orders (user_id, products, delivery_fee, total) VALUES ($1, $2, $3, $4) RETURNING * ;', [ req.user.userId, orderProducts, 15, total, ] )

Desalutar- Автор вопроса

Кидал же скрин ошибки

Desalutar
Кидал же скрин ошибки

Только текст, никаких скринов

Desalutar
Кидал же скрин ошибки

Ах, скрин. Ну да, скрины тут не все читают, действительно (я, в том числе — не читаю).

Максим Мартынов
Только текст, никаких скринов

Текстовым файлом или на pastebin.com/его аналог

Desalutar
вот полная запись вставки const order = await db...

А теперь — присвоения переменных и импорты этого файла!

Desalutar- Автор вопроса
Ilya Anfimov
А теперь — присвоения переменных и импорты этого ф...

вот весь код контроллера, если врям нужно все const createOrder = async (req, res) => { const { basketProducts } = req.body const orderProducts = [] let total = 0, count = 0 for (let item of basketProducts) { const basketProduct = await db.query( 'SELECT * FROM basket_product WHERE id = $1 AND basket_id = (SELECT id FROM basket WHERE user_id = $2)', [item.id, req.user.userId] ) if (!basketProduct.rows[0]) { throw new APIerror( No product in basket with id ${id}, StatusCodes.NOT_FOUND ) } const product = await db.query('SELECT * FROM products WHERE id = $1', [ item.product_id, ]) if (!product.rows[0]) { throw new APIerror( No product with id ${product_id}, StatusCodes.NOT_FOUND ) } const price = !!product.rows[0].discount ? Number(product.rows[0].price * (1 - product.rows[0].discount / 100.0)) : Number(product.rows[0].price) const orderProduct = { id: product.rows[0].id, image: product.rows[0].image, title: product.rows[0].title, price, color: basketProduct.rows[0].color, size: basketProduct.rows[0].size, count: basketProduct.rows[0].count, } orderProducts.push(orderProduct) total += orderProduct.price * orderProduct.count count += orderProduct.count } const order = await db.query( 'INSERT INTO orders (user_id, products, delivery_fee, total) VALUES ($1, $2, $3, $4) RETURNING * ;', [ req.user.userId, orderProducts, 15, total, ] ) return res.status(StatusCodes.CREATED).json({ order: order.rows[0] }) }

Desalutar- Автор вопроса
Ilya Anfimov
Да, так значительно понятнее.

вот импорты const { StatusCodes } = require('http-status-codes') const db = require('../db/db') const { APIerror } = require('../services/API-error')

Desalutar
вот весь код контроллера, если врям нужно все co...

Осталось выяснить как минимум — библиотеку, которая используется для работы с постгресом (я вижу как минимум дву — pg и posgres), ну и ошыбку.

Desalutar- Автор вопроса
Ilya Anfimov
И что там в ../db/db ?

const Pool = require('pg').Pool const pool = new Pool({ user: 'postgres', host: 'localhost', database: process.env.DB_NAME, password:process.env.DB_PASSWORD, port: 5432, }) module.exports = pool

Ilya Anfimov
Осталось выяснить как минимум — библиотеку, котора...

а какая разница какую библиотеку он использует, если он пишет по сути нативный sql? у него объект, который при вставке через параметры меняет тип и конструкция sql запроса которая формируется просто не правильная получается

Desalutar- Автор вопроса
Desalutar
const Pool = require('pg').Pool const pool = new P...

Ну и да, ладно, б-г с ней, с ошыбкой. Подозреваю, что этот pg в принцыпе не имеет кода для преобразования чего бы то ни было в row (или record) в постгресе. Потому собирать это придётся так или иначе самому. Вот каждую запись того массива — вместо javascript object — преобразовать в какой-нибудь текст вида 'row()' ... Как это конкретно лучшэ сделать — можно подумать. Или подумать о том, что вы делаете, похожэ, что-то не то. Вообще, примерно 99% использований массивов в постгресе — используются совершэнно зря (в том числе, по-моему, зря их используются в ядре постгреса для acl).

anton potapov
а какая разница какую библиотеку он использует, ес...

Разница в том, что это именно библиотека преобразует внутренние типы javascript в параметры в протоколе постгреса. И ключевой вопрос — можэт ли она как-нибудь преобразовать object/array/etc в row/array/etc.

Ilya Anfimov
Разница в том, что это именно библиотека преобразу...

одно дело преобразовать просто тип - строка, число, возможно умеет int[] и подобные, другое кастомный тип, про который библиотека даже не знает

anton potapov
insert into orders_test (products) values ( ...

и вряд ли она соберёт такую конструкцию

Похожие вопросы

Обсуждают сегодня

А как старый хаскел с новым стыковать ? потому как тут работает https://play.haskell.org/saved/C3xpMzcd, а вот тут https://stepik.org/lesson/7602/step/9?unit=1473 нет ошибка C...
Fedor
131
что насчет пагинга? на осдеве непонятно(
Vi Chapmann 🪙
26
Вопрос я правильно понимаю что в коде newtype ArrowMap k v = ArrowMap { getArrowMap :: k -> Maybe v } getArrowMap есть функция типа k -> Maybe v, если да, то не понимаю задач...
Fedor
64
Ребят, что лучше для реверса: гидра или ида?
En Vind Av Sorg
26
Делаю велосипед логгер. К сообщению хочу прикрутить некоторую информацию, типа, кем отправлено, какой уровень, и всякое такое. И тут подумалось мне, почему бы не хранить весь...
Serjone
24
Как Вы считаете нормально ли в двадцатых годах 21 века в ВУЗах Российской Федерации обучать студентов работе с TASM? Не слишком ли это "архаично"? (Если оффтоп или флейм для э...
Spiker01
52
Всем привет! Использую gitlab-ci. Настроил gitlab-agent для деплоя в куб. При деплое проекта в логах такая ошибка: Executing deploy plan failed to watch "ns:my-project/Ingress...
Konstantin Moiseev
4
Комрады, хотел уточнить. Проперть в OnDestroy юнита-хозяина по-прежнему доступна? И еще уточнение: finalization юнита наступает раньше или позже OnDestroy?
Ed Doc
48
Продолжая диалог про свифт в проде – сейчас возник вопрос в активном наборе бекендеров. В основном в нашей компании мы фанаты Java Spring и полностью ей довольны. Однако найм ...
Guseyn
27
Читаю сейчас [нет, уже больше не читаю!] курсовую о Булгакове, написанную, похоже, с помощью ChatGPT. Это удивительный психоделический опыт. Текст в основном написан в стиле б...
✨ Uni [🌊 В отпуске]
1
Карта сайта