Можно создать в базе функцию, которая принимает json:
CREATE TABLE my_table (id BIGINT NOT NULL PRIMARY KEY, first_name VARCHAR(50) UNIQUE, last_name VARCHAR(50));
CREATE FUNCTION add_obj (p_obj json)
RETURNS int
LANGUAGE plpgsql
AS $$
DECLARE
p_id int := p_obj ->> 'id';
p_name TEXT := p_obj ->> 'name';
p_last_name TEXT := p_obj ->> 'lastName';
BEGIN
INSERT INTO my_table (
id, first_name, last_name
) VALUES (
p_id, p_name, p_last_name
) RETURNING id;
END;
$$;
Затем взять низкоуровневую библиотеку:
npm i pg
И с ее помощью дергать функцию:
import pkg from 'pg';
const { Pool } = pkg;
export class PostgresDriver {
constructor(config) {
this.pool = new Pool(config);
this.pool.on('error', err => {
console.error('StoreDB Postgres error', err);
});
}
async getPoolClient() {
try {
return await this.pool.connect();
} catch (e) {
throw new Error('StoreDB -> poolConnect() ->', e.message);
}
}
async addObject(obj) {
const json = JSON.stringify(obj);
const sql = `CALL add_obj('${json}');`;
try {
const client = await this.getPoolClient();
const rs = await client.query(sql);
client.release();
return rs;
} catch (e) {
throw new Error(`PostgresDriver -> ${sql}`);
}
}
}
Но я бы рекомендовал переименовать id в ext_id и добавить к таблице безопасный первичный ключ с типом serial.