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

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

41 ответов

57 просмотров

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

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

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

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

30500 за редактор? )
Владимир
47
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
вы делали что-то подобное и как? может есть либы готовые? увидел картинку нокода, где всё линиями соединено и стало интересно попробовать то же в ddl на lua сделать. решил с ч...
Victor
8
Подскажите пожалуйста, как в CustomDrawCell(Sender: TcxCustomGridTableView; ACanvas: TcxCanvas; AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean); получить наз...
A Z
7
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
1
Он в одиночку это дело запилил или была какая-то команда?
Aquinary
12
~ 2m21s  nix shell github:nixos/nixpkgs#stack ~  stack ghc -- --version error: … while calling the 'derivationStrict' builtin at /builtin/derivation.nix:...
Rebuild your mind.
6
Всем привет, нужна как никогда, нужна помощь с IO в загрузчике. Пишу в code16 после установки сегментных регистров, пишу вывод символа. Пробовал 2 варианта: # 1 mov $0x0E, %a...
Shadow Akira
14
Карта сайта