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

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

41 ответов

24 просмотра

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 ( ...

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

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

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

а зачем этот вопрос для удаления из чата?
Mёdkinson Medvezhkin
63
Добрый день. Хочу сделать отрисовку по команде на панели. Почему-то рисуется только при втором вызове. С чем может быть связано, не подскажете? procedure TForm1.FormDblClick(...
Kirill Filippenok
20
Всем доброго дня! Подскажите может кто использовал связку Pagebuilder + Clientsetting. Сами параметры с типом pagebuilder в модуле Clientsetting работают нормально, можно такж...
Александр Добриков
12
А почему в си некоторые вещи работают с двойными кавычками некоторые с одинарными? Нельзя было все сделать с одними или чтоб работало с разными? например чтоб выводить строки ...
.
15
Всем привет! Нужен совет от опытных. Переношу свой проект с Делфи 10.2 Токио на Лазарус 3.2 установленный через инсталлятор fpcupdeluxe-x86_64-win64. При импортировании проект...
Дмитрий Завгородний
7
Эх кто-то пришел и весь праздник испортил :( You need complex FBX scene importing setup to change things on import? good luck with that. You need navigation and pathfinding? g...
Serg Gini
5
Всем привет! Подскажите. Я написал приложение на Delphi 10.2 Tokyo под Windows 10. И передо мной стал вопрос о том чтобы сделать это приложение кроссплатформенным (под Linux и...
Дмитрий Завгородний
24
Всем привет! procedure TForm1.FormCreate(Sender: TObject); type TStartEnd = record S: Byte; E: Byte; end; var a, b: TStartEnd; begin {1} a.S := 1; {2} a.E := 2; ...
Руслан Михайлович
10
Всем привет!) я тут новенький и пытаюсь освоить evolution методом тыка. У меня при переходе между папками файлов выскакивают вот такие уведомления Можете подсказать как их от...
Диман Samoed
10
Какого хера? /Sources/App/Modules/User/Models/UserLinkApple.swift:21:20: warning: stored property '_id' of 'Sendable'-conforming class 'UserLinkApple' is mutable @ID(...
Alexander Sherbakov
14
Карта сайта