PGORM — HTML/JS ORM для PostgreSQL
Более подробно инcтрумент описан на отдельном сайте pgorm.org


Описание

PGORM - инструмент для работы с базой данных PostgreSQL непосредственно с web-страниц, позволяет подключаться, выполнять SQL-запросы, использовать ORM и получать файлы

Реализован как служба, которая принимает HTTP-запросы от браузера и возвращает ответ в зависимости от вида доступа (см. ниже). В базе данных настраивается список таблиц, которые будут отображены в классы JavaScript. Для каждой таблицы автоматически создается модуль JavaScript, который можно использовать через конструкцию import { [Table],[TableArray] } from '/orm/[Schema]/[Table].js';

Для простых систем pgorm устанавливается на сервер базы данных и используется самостоятельно, для сложных - на сервер базы данных или сервер приложений, на основном web-сервере (например, nginx) настраивается переправление запросов /pgorm/*,/orm/*.

Виды доступа


ORM-работа со строками таблицы базы данных PostgreSQL как с объектами JavaScript (object-relational mapping)
SQL-выполнение SQL-запросов и команд, результат возвращается в формате JSON с автоприведением типов
[GET] file-получение файлов (.html, .js и т.д.), включая модули JavaScript для подключения к базе данных, выполнения SQL-запросов, работы с таблицами


Простой пример

Создание таблицы invoice и включение для нее объектно-реляционного отображения (ORM)
-- Создаем таблицу
create table invoice(
  id serial primary key,
  date date not null default current_date,
  number varchar(10) not null,
  amount numeric(20,2) not null  
);

-- Включаем ORM для таблицы, JavaScript-модули создадутся автоматически    
call pgorm.orm_table_enable('invoice');

-- Создаем пользователя и выдаем ему права на таблицу  
create user user_1 login password 'user_1';
grant all on invoice,invoice_id_seq to user_1;

Создание объекта класса Invoice и сохранение его в базу данных
<!DOCTYPE html>
<html>
<head>  <meta charset="utf-8"> <title>PGORM | Простой пример</title> </head>
<body> 

<button id="buttonCreateInvoice">Создать накладную</button> <br><br>

Результат
<div id="result" style="border: 1px solid black; width: 500px; height: 200px;"></div>

<script type="module">

// Импортируем классы подключения и таблицы Invoice из автоматически созданных модулей
import { ORMConnection } from "/orm/pgorm-db.js";
import { Invoice }       from "/orm/public/Invoice.js";

function createInvoice() {
  try {
    // Создаем подключение, подключаемся к базе данных и устанавливаем данное подключение по умолчанию
    new ORMConnection().connect('user_1', 'user_1').setDefault();
    // Создаем объект класса Invoice
    let invoice = new Invoice();
    // Устанавливаем значения полей
    invoice.setNumber('12/34');
    invoice.setAmount(567.89);
    // Сохраняем объект, после сохранения автозаполняемые поля будут содержать значения
    invoice.save();
    // Показываем объект
    document.getElementById("result").innerHTML = "Накладная<br><br>" +
      "ID: "     + invoice.getID() + "<br>" +
      "Date: "   + invoice.getDate().toISOString() + "<br>" +
      "Number: " + invoice.getNumber() +"<br>" +
      "Amount: " + invoice.getAmount();
    // Отключаемся от базы данных
    ORMConnection.getDefault().disconnect();
  } catch (exception) {
    // При возникновении исключения показываем его
    document.getElementById("result").innerHTML = "Ошибка<br><br>"+exception.message;
  }
}

document.getElementById("buttonCreateInvoice").addEventListener("click", createInvoice);

</script>

</body>
</html>