GoProg

 
Топ хэштегов


Архив

PostgreSQL уже достаточно долго занимает одно из лидирующих мест среди СУБД. Помимо использования SQL он позволяет создавать хранимые процедуры на других языках программирования таких как C/C++, Java, JavaScript и др. В том числе и на Go. Для этого существует расширение plgo. С его помощью генерируется врапер для кода, файлы extention для PostgreSQL и компилируется пакет.

Перед установкой plgo, нужно установит нужную dev-версию PotgreSQL. На Ubuntu это можно сделать так:

sudo apt-get install postgresql-server-dev-X.Y

X.Y - нужно заменить на нужную версию.

После это ставим расширение:

go get -u gitlab.com/microo8/plgo/plgo 

Теперь можно приступить к написанию хранимых процедур на plgo, что сделать достаточно просто. Для этого нужно сделать пакет main, в котором будут объявлены все необходимые процедуры.

package main 

import (
  "log"
  "strings"

  "gitlab.com/microo8/plgo"
)

func Meh() {
  // NoticeLogger печатаем в log
  logger := plgo.NewNoticeLogger("", log.Ltime|log.Lshortfile)
  logger.Println("meh")
}

// конкатенация всех значений выбранного столбца заданной таблицы
func ConcatAll(tableName, colName string) string {

  // ErrorLogger
  logger := plgo.NewErrorLogger("", log.Ltime|log.Lshortfile)

  // подключаемся к БД
  db, err := plgo.Open()
  if err != nil {
    logger.Fatalf("Cannot open DB: %s", err)
  }
  defer db.Close() // не забываем закрыть коннект

  // формируем запрос
  query := "select " + colName + " from " + tableName 

  stmt, err := db.Prepare(query, nil)
  if err != nil {
    logger.Fatalf("Prepare failed (%s): %s", query, err)
  } 

  // выполняем запрос  
  rows, err := stmt.Query()
  if err != nil {
    logger.Fatalf("Query (%s) error: %s", query, err)
  } 

  // извлекаем все строки
  var ret string 
  for rows.Next() {
    var val string 
    rows.Scan(&val)
    ret += val
  }

  return ret
} 

// пример функции для триггера
func CreatedTimeTrigger(td *plgo.TriggerData) *plgo.TriggerRow {
    
  //установка столбца под номеров 4 в now() 
  td.NewRow.Set(4, time.Now())

  //возврат измененной строки 
  return td.NewRow 
} 

// конкатенация массива строк
func ConcatArray(strs []string) string {
    return strings.Join(strs, "")
} 

Для установки расширения нужно воспользоваться утилитой plgo:

plgo [путь к пакету] 

В результате чего будет создана директория build со всем необходимым (Makefile, extention.sql,…) Запускаем установку:

cd build 
sudo make install

После выполнения установки можно использовать расширение в PostgreSQL:

CREATE EXTENSION myextention; 

Вызываем нашу функции конкатенации строк:

SELECT concatarray(ARRAY['foo','bar']); 

Получаем результат:

concatarray
-------------
foobar 
(1 row)

Обращу особое внимание на использование горутин из plgo. Здесь не все так хорошо, plgo будет пытаться выделить памяти больше чем значение max_stack_depth, из-за чего могут быть проблемы. При помощи некоторых трюков это можно обойти, но я бы не советовал.

#databases #Go #golang #IT #plgo #postgres #postgresql #базыданных



Новый комментарий: