...

Модуль для работы с postgreSQL

Тема в разделе "Примеры решений и дополнительных модулей", создана пользователем kamyshev, 13 дек 2022.

  1. kamyshev

    kamyshev Активный участник

    Вашему вниманию представляю модуль для работы с postgreSQL базами данных. Модуль реализован с использованием механизма серверных зависимостей. При разработке используется npm пакет pg.

    Возможности модуля

    • Подключение осуществляется по connection string, указывается в настройках модуля
    • Создание простых таблиц, с указанием полей, типа полей и опций (not null, default, etc.)
    • Выполнение запросов и вывод результата в виде JSON-объекта
    Реализация
    Данный виджет показывает работу с серверными зависимостями. Чтобы их использовать, необходимо найти подходящий npm пакет на просторах Интернета. На текущий момент платформа поддерживает работу с пакетами CommonJS. Далее, необходимо установить docker и воспользоваться скриптом, приведенном в справке для создания архива.
    После получения архива, его необходимо использовать внутри виджета. Подгружаем архив на вкладке Файлы и в сценариях на стороне сервера объявляем импорт пакета:
    Код:
    
    import * as pg from 'pg'
    
    
    После объявляем необходимые нам функции, "собираем" внешний вид виджета, выполняем low-code часть работ. Привожу листинг функций, которые используются в модуле:
    Код:
    
    async function query(): Promise<void> {
        
    // Выполняем подключение к базе данных
        
    const client = new pg.Client({
            
    connectionString: Namespace.params.data.connection_string,
        })
        
    await client.connect()
        
    // Выполняем запрос к базе данных
        
    const res await client.query({textContext.data.query_input})
        
    // Выводим различные сообщения об успехе для разных видов команд
        
    switch(res.command) {
            case 
    'INSERT':
                
    Context.data.result 'Data inserted!'
                
    break
            case 
    'SELECT':
                
    Context.data.result JSON.stringify(res.rows)
                break
            default:
                
    Context.data.result 'ok'
                
    break
        }
        
    // Закрываем подключение к базе данных
        
    await client.end()
    }
    async function createTable(): Promise<void> {
        
    let fields_stringstring ''
        
    // Собираем в строку описание полей в соответствии с синтаксисом SQL
        
    if(Context.data.table_fields && Context.data.table_fields.length 0){
            for(const 
    item of Context.data.table_fields){
                
    let optionsstring ''
                
    item.options options item.options options ''
                
    fields_string += `${item.field_name} ${item.field_data_type} ${options}`
            }
        }
        
    // Убираем последний пробел и запятую в списке с описанием полей
        
    const prepared_string = `CREATE TABLE ${Context.data.table_name} (${fields_string.substring(0fields_string.length-2)})`
        
    // Выполняем подключение к базе данных
        
    const client = new pg.Client({
            
    connectionString: Namespace.params.data.connection_string,
        })
        
    await client.connect()
        
    // Отправляем запрос в базу данных и выводим сообщение об успехе
        
    const res await client.query(prepared_string)
        
    Context.data.result = `${res.command} table ${Context.data.table_name}!`
        
    // Закрываем подключение к базе данных
        
    await client.end()
    }
    С полной документацией по пакету можно ознакомиться здесь.

    Вложения:

    Последнее редактирование: 13 дек 2022
  2. DLeonov

    DLeonov Новичок

    А можете показать формат connection string, который используете для подключения?
  3. kamyshev

    kamyshev Активный участник

  4. fkam

    fkam Участник

    Добрый день! А можете показать, когда делаете select, какой ответ получаете? Или сценарий какой select прописываете? Буду признателен.
    Ваш select такого вида?
    select app.body ->>'__name'
    from head."personnel_section:mass_recruitment_2" app
  5. fkam

    fkam Участник

  6. kamyshev

    kamyshev Активный участник

    Прошу прощения, но этот пост в первую очередь как пример работы с NPM-пакетами, а не работы с БД продукта ELMA365.