Форум программистов, компьютерный форум, киберфорум
PostgreSQL
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 21.01.2023
Сообщений: 10

PGORM | Web сервер для PostgreSQL

01.04.2023, 10:24. Показов 735. Ответов 4

Студворк — интернет-сервис помощи студентам
Добрый день, коллеги.

Сделал web-сервер PGORM, который принимает HTTP-запросы от браузера и возвращает ответ в зависимости от вида доступа.
В базе данных настраивается список таблиц, которые будут отображены в классы JavaScript.

Исходный код открыт, выложен на GitHub, можно форкать и копировать.

Пример

SQL
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
-- Создаем таблицу
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;
JavaScript
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<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>
Ключевые особенности

Модули и переопределение классов - Для каждой таблицы создаются два модуля: редактируемый и автоформируемый с суперклассами
Автопреобразование типов - Реализовано автоматическое преобразование типов данных SQL и JavaScript, в том числе и массивов
Строка таблицы и массив - Для каждой таблицы создаются два класса: единичная строка (TableRow) и массив строк таблицы (TableRowArray extends Array)
Автометоды массива строк - В классе массива строк таблицы автоматически создаются методы загрузки по индексу и сортировок
Нейминг - имя класса для таблицы и имена полей для столбцов формируются автоматически, но можно указать их явно
Автокорректировка - При выполнении DDL-операций над таблицей (alter table, create index и т.д.) срабатывает триггер, который обновляет JavaScript модуль
Простота и самодостаточность - Сервер по HTTP отдает созданные им модули, установка заключается в копировании исполняемого файла


Cкачать можно на сайте https://pgorm.org/ru/download/
Также сделан ролик на youtube https://www.youtube.com/watch?v=mbz_eGMlRQo

Конструктивные вопросы и критика приветствуется, можно здесь или в личку.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
01.04.2023, 10:24
Ответы с готовыми решениями:

Собрать сервер для БД PostgreSQL
доброго времени суток. есть необходимость собрать машину, что бы на ней был PostgreSQL, для обращения к этой БД с 5-7 компов полагаю...

Сервер для web 2.0
Доброго времени суток! У меня возник такой вопрос:готовлюсь к созданию глобального проекта по созданию интернет проекта web 2.0 -...

Web сервер для графики
Задача: на веб-сервере работать с графикой, т.е. создавать, обрабатывать на лету графические файлы. Что лучше использовать для этих целей,...

4
1263 / 977 / 384
Регистрация: 02.09.2012
Сообщений: 3,020
01.04.2023, 12:42
Для информации: https://postgrest.org/en/stable/
0
55 / 50 / 5
Регистрация: 30.06.2022
Сообщений: 251
01.04.2023, 13:40
Я правильно понял, что это модель типа "активная запись"?
Ну когда класс представлен таблицей и прочее.

Добавлено через 1 минуту
И тут же вопрос: чем это лучше, чем та же Ruby on Rails?
А ваш механизм должен иметь ощутимые плюсы, чтоб разрабы на него перешли..
0
0 / 0 / 0
Регистрация: 21.01.2023
Сообщений: 10
02.04.2023, 12:49  [ТС]
1. PostgREST не поддерживает ORM

2. Ruby on Rails - это мощная система: язык программирования + фреймворк.
PGORM с ней не сопоставим, но он очень простой и автосоздает модули javascript,
которые сразу готовы с использованию
0
0 / 0 / 0
Регистрация: 21.01.2023
Сообщений: 10
18.11.2023, 17:59  [ТС]
Сделал маппировние строк таблиц, связанных по внешним ключам (relationships).

ORM-класс (модуль JavaScript) содержит статические методы возвращающие описание связи (внешнего ключа).

Для исходящих внешних ключей (parent) создаются методы get and set, которые оперируют уже ORM-объектами, методы синхронизированы с полями класса.
Для входящих внешних ключей (children) создаются методы getCildren, addChild and deleteChild, которые оперируют массивом ORM-объектов, возможно указать автозаполняемый столбец сортировки.

Фрагмент кода JavaScript с использованием связанных объектов (строк таблиц)
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
  // Create object customer, set name and save 
  var customer = new Customer().setName("Horns and hooves").save();
  // Show customer ID that was assigned when object was saved
  document.getElementById("CustomerID").innerHTML = customer.getID();
  // Create object invoice, set customer as parent object, fields, save, add two children
  var invoice = new Invoice().setCustomer(customer).setNumber("12/34").setAmount(567.89).save();
  invoice.addInvoiceProduct(new InvoiceProduct().setProductName("Pensil").setQuantity(3));
  invoice.addInvoiceProduct(new InvoiceProduct().setProductName("Eraser").setQuantity(5));
  // Show invoice object and its relations
  document.getElementById("Invoice").innerHTML = JSON.stringify(invoice);
  document.getElementById("InvoiceCustomer").innerHTML = JSON.stringify(invoice.getCustomer());
  document.getElementById("InvoiceProductArray").innerHTML = JSON.stringify(invoice.getInvoiceProductArray());
Полный пример с SQL и ORM-модулями можно загрузить с сайта https://pgorm.org/ru/download/

Также сделал ролик на youtube


Конструктивные вопросы и критика приветствуются, можно здесь или в личку.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
18.11.2023, 17:59
Помогаю со студенческими работами здесь

Сервер для Rust, Web, mySQl
Здравствуйте дорогие формучане! Хочу собрать сервер для сервера Rust, пары сайтов и баз дынных. Думаю взять 2 INTEL xeon X5650 за 1...

Для чего устанавливается web-сервер?
Здравствуйте. Подскажите пожалуйста простыми словами. С какой целью на сервере сисадмины устанавливают web-сервер? В поисковиках нашёл...

Сервер для Web API на Windows 10
Есть ли возможность поднять какой-нибудь сервер на обычной домашней win10, на котором можно захостить WEB API? и если да, то есть ли...

Web-сервер апликации для Денвера (MySQL)
Здравствуйте! Решил попробовать написать программу для веб-сервера на Денвере. Нужно будет иметь возможность без дополнительных надстроек...

Web форма для отправки данных на сервер
Заранее извиняюсь, но в PHP полный ноль не говоря уже про базы данных. В общем задача следующая: Есть куча (Допустим 50) клиентов...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru