@gifon

Как создать команду для sql?

Здравствуйте, у меня есть обэкт
let obj={
id:1,
name: "someName",
lastName: "someLastName",
}

И я хочу залить в базу все его поля
база типа
CREATE TABLE myTable (id BIGINT NOT NULL PRIMARY KEY, firstName VARCHAR(50) UNIQUE, lastName VARCHAR(50));

Чтоб создать команду sql
пришлось наделать такое
let query = "";
          query += "INSERT INTO";
          query += " " + obj.__TABLE_NAME;
          query += "(";
          for (field in obj) {
            query += field + ",";
          }
          query += ") " + "VALUES" + " (";
          for (field in obj) {
            query += obj[field] + ",";
          }
          query += ")";
          query += "ON CONFLICT (name)";
          query += "DO UPDATE SET ";
          for (field in obj) {
            query += field + " = " + "EXCLUDED." + field + " ";
          }
          query = ";";

Но почему-то мне это напоминает г-код, существуют ли другие подходы...
  • Вопрос задан
  • 164 просмотра
Пригласить эксперта
Ответы на вопрос 1
@romaro
Можно создать в базе функцию, которая принимает 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.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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