postgres

package
v2.7.10 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Apr 10, 2025 License: LGPL-3.0 Imports: 19 Imported by: 0

Documentation

Overview

Funciones de gestión para POSTGRESQL usando el driver pgxpool

Index

Examples

Constants

This section is empty.

Variables

This section is empty.

Functions

func AcquireConnection

func AcquireConnection() (conn *pgxpool.Conn, err error)

Obtiene una conexión del pool

func CommitTX

func CommitTX()

Finaliza una transacción

Example
package main

import (
	"github.com/horus-es/go-util/v2/logger"
	"github.com/horus-es/go-util/v2/postgres"
)

func main() {
	postgres.StartTX()
	defer postgres.RollbackTX()
	// Inicio del bloque protegido con transacción
	logger.Infof("... órdenes SQL contenidas en la transacción ...")
	// Fin del bloque protegido con transacción
	postgres.CommitTX()
}
Output:

INFO: StartTX
INFO: ... órdenes SQL contenidas en la transacción ...
INFO: CommitTX

func DeleteRow

func DeleteRow(id string, table string)

Elimina una fila en una tabla que tenga una pk (id uuid). Panic si la fila no existe

Example
package main

import (
	"github.com/horus-es/go-util/v2/formato"
	"github.com/horus-es/go-util/v2/logger"
	"github.com/horus-es/go-util/v2/postgres"
	"github.com/jackc/pgx/v5/pgtype"
)

type T_personal struct {
	ID            string
	Operador      pgtype.UUID
	Codigo        string
	Nombre        string
	Hash          pgtype.Text
	Activo        bool
	Administrador bool
	Tag           string
}

func init() {
	postgres.InitPool(`
	    host=devel.horus.es
		port=43210
		user=SPARK2
		password=lahh4jaequ2I
		dbname=SPARK2
		sslmode=disable
		application_name=_TEST_`, nil)
}

var UUIDoperador = "0cec7694-eb8d-4ab2-95bb-d5d733a3be94"

func main() {
	u := T_personal{}
	u.Operador, _ = formato.ParseUUID(UUIDoperador)
	u.Codigo = "TestDelete"
	u.Nombre = "Usuario de prueba"
	u.Activo = true
	u.ID = postgres.InsertRow(u, "hash='zecreto2023'")
	logger.Infof("Una fila insertada")
	postgres.DeleteRow(u.ID, "personal")
	logger.Infof("Una fila eliminada")
}
Output:

INFO: insert into personal (operador,codigo,nombre,hash,activo,administrador,tag) values ('0cec7694-eb8d-4ab2-95bb-d5d733a3be94','TestDelete','Usuario de prueba','zecreto2023',true,false,'') returning id
INFO: Una fila insertada
INFO: delete from personal where id='81c11fc2-0439-4ae5-baa4-3d40716bdce3'
INFO: Una fila eliminada

func GetOneOrZeroRows

func GetOneOrZeroRows(dst any, query string, params ...any) bool

Función de utilidad para consultas que solo pueden devolver una (resultado true) o ninguna filas (resultado false). Panic si la query devuelve mas de una fila.

Example
package main

import (
	"github.com/horus-es/go-util/v2/logger"
	"github.com/horus-es/go-util/v2/postgres"
)

var (
	UUIDempleado = "fe90b961-0646-4f8e-a698-d3a153abf7d2"

	UUIDnoexiste = "fe90b951-9999-9999-9999-999999999999"
)

func main() {
	u := struct {
		Codigo string
		Activo bool
	}{}
	if postgres.GetOneOrZeroRows(&u, "select codigo,activo from personal where id=$1", UUIDempleado) {
		logger.Infof("Hallado usuario: %q\n", u.Codigo)
	}
	if !postgres.GetOneOrZeroRows(&u, "select codigo,activo from personal where id=$1", UUIDnoexiste) {
		logger.Infof("Usuario no hallado.\n")
	}
}
Output:

INFO: select codigo,activo from personal where id='fe90b961-0646-4f8e-a698-d3a153abf7d2'
INFO: Hallado usuario: "pablo7"
INFO: select codigo,activo from personal where id='fe90b951-9999-9999-9999-999999999999'
INFO: Usuario no hallado.

func GetOneRow

func GetOneRow(dst any, query string, params ...any)

Función de utilidad para consultas que devuelven exactamente una fila. dst puede ser la direccion de una struct o de una variable simple. Panic si la query devuelve mas de una fila o no devuelve ninguna fila.

Example
package main

import (
	"github.com/horus-es/go-util/v2/logger"
	"github.com/horus-es/go-util/v2/postgres"
)

var UUIDempleado = "fe90b961-0646-4f8e-a698-d3a153abf7d2"

func main() {
	u := struct {
		Codigo string
		Activo bool
	}{}
	postgres.GetOneRow(&u, "select codigo,activo from personal where id=$1", UUIDempleado)
	logger.Infof("%v", u)
}
Output:

INFO: select codigo,activo from personal where id='fe90b961-0646-4f8e-a698-d3a153abf7d2'
INFO: {pablo7 true}

func GetOrderedRows

func GetOrderedRows(dst any, query string, params ...any)

Función de utilidad para consultas que pueden devolver varias filas. Panic si la query no contiene un "order by".

Example
package main

import (
	"strings"

	"github.com/horus-es/go-util/v2/logger"
	"github.com/horus-es/go-util/v2/postgres"
)

var UUIDoperador = "0cec7694-eb8d-4ab2-95bb-d5d733a3be94"

func main() {
	us := []string{}
	postgres.GetOrderedRows(&us, "select codigo from personal where operador=$1 and codigo>'dad' order by codigo limit 3", UUIDoperador)
	logger.Infof("Primeros 3 usuarios hallados: %s\n", strings.Join(us, ", "))
}
Output:

INFO: select codigo from personal where operador='0cec7694-eb8d-4ab2-95bb-d5d733a3be94' and codigo>'dad' order by codigo limit 3
INFO: Primeros 3 usuarios hallados: dadiz, emple, emple100E

func InitPool

func InitPool(connectString string, logger *logger.Logger)

Conecta a la base de datos y establece el logger. Si el logger es nil, se usa el logger por defecto.

func InsertRow

func InsertRow(src any, especiales ...string) string

Inserta una fila en una tabla cuyo nombre sea el del tipo de src (T_nombretabla) y que tenga una pk (id uuid). Especial contiene una lista de campos a excluir o incluir de la insercion:

campo => solo se inserta este campo y otros explicitamente incluidos.
-campo => se excluye este campo de la inserción.
campo=expresion => se inserta este campo con esta expresion.

Por ejemplo si especial es "-inicio","final=now()","parking=null" se excluye inicio, final=hora actual y parking=nulo. Devuelve el id de la fila insertada.

Example
package main

import (
	"github.com/horus-es/go-util/v2/formato"
	"github.com/horus-es/go-util/v2/logger"
	"github.com/horus-es/go-util/v2/postgres"
	"github.com/jackc/pgx/v5/pgtype"
)

type T_personal struct {
	ID            string
	Operador      pgtype.UUID
	Codigo        string
	Nombre        string
	Hash          pgtype.Text
	Activo        bool
	Administrador bool
	Tag           string
}

func init() {
	postgres.InitPool(`
	    host=devel.horus.es
		port=43210
		user=SPARK2
		password=lahh4jaequ2I
		dbname=SPARK2
		sslmode=disable
		application_name=_TEST_`, nil)
}

var UUIDoperador = "0cec7694-eb8d-4ab2-95bb-d5d733a3be94"

func main() {
	u := T_personal{}
	u.Operador, _ = formato.ParseUUID(UUIDoperador)
	u.Codigo = "TestInsert"
	u.Nombre = "Usuario de prueba"
	u.Activo = true
	u.ID = postgres.InsertRow(u, "hash='zecreto2023'")
	logger.Infof("Una fila insertada")
	postgres.DeleteRow(u.ID, "personal")
	logger.Infof("Una fila eliminada")
}
Output:

INFO: insert into personal (operador,codigo,nombre,hash,activo,administrador,tag) values ('0cec7694-eb8d-4ab2-95bb-d5d733a3be94','TestInsert','Usuario de prueba','zecreto2023',true,false,'') returning id
INFO: Una fila insertada
INFO: delete from personal where id='81c11fc2-0439-4ae5-baa4-3d40716bdce3'
INFO: Una fila eliminada

func ReleaseConnection

func ReleaseConnection(conn *pgxpool.Conn)

Devuelve una conexión al pool

func RollbackTX

func RollbackTX()

Aborta una transacción

Example
package main

import (
	"github.com/horus-es/go-util/v2/errores"
	"github.com/horus-es/go-util/v2/logger"
	"github.com/horus-es/go-util/v2/postgres"
)

func main() {
	defer func() { recover() }() // Capturamos panic
	postgres.StartTX()
	defer postgres.RollbackTX()
	// Inicio del bloque protegido con transacción
	logger.Infof("... órdenes SQL contenidas en la transacción ...")
	errores.PanicIfTrue(true, "... algo produce un panic ...")
	logger.Infof("... mas órdenes SQL ...")
	// Fin del bloque protegido con transacción
	postgres.CommitTX()
}
Output:

INFO: StartTX
INFO: ... órdenes SQL contenidas en la transacción ...
WARN: RollbackTX

func StartTX

func StartTX()

Comienza una transacción

Example
package main

import (
	"github.com/horus-es/go-util/v2/logger"
	"github.com/horus-es/go-util/v2/postgres"
)

func main() {
	postgres.StartTX()
	defer postgres.RollbackTX()
	// Inicio del bloque protegido con transacción
	logger.Infof("... órdenes SQL contenidas en la transacción ...")
	// Fin del bloque protegido con transacción
	postgres.CommitTX()
}
Output:

INFO: StartTX
INFO: ... órdenes SQL contenidas en la transacción ...
INFO: CommitTX

func UpdateRow

func UpdateRow(src any, especiales ...string)

Actualiza una fila en una tabla cuyo nombre sea el del tipo de src (T_nombretabla) y que tenga una pk (id uuid). Especial contiene una lista de campos a incluir o excluir de la actualización:

campo => solo se actualiza este campo y otros explicitamente incluidos.
-campo => se excluye este campo de la actualización.
campo=expresion => se actualiza este campo con esta expresion.

Por ejemplo si especial es "-inicio","final=now()","parking=null" se excluye inicio, final=hora actual, parking=nulo y la tabla a actualizar es otra Panic si la fila no existe

Example
package main

import (
	"github.com/horus-es/go-util/v2/logger"
	"github.com/horus-es/go-util/v2/postgres"
	"github.com/jackc/pgx/v5/pgtype"
)

type T_personal struct {
	ID            string
	Operador      pgtype.UUID
	Codigo        string
	Nombre        string
	Hash          pgtype.Text
	Activo        bool
	Administrador bool
	Tag           string
}

var UUIDempleado = "fe90b961-0646-4f8e-a698-d3a153abf7d2"

func main() {
	u := T_personal{}
	postgres.GetOneRow(&u, "select * from personal where id=$1", UUIDempleado)
	logger.Infof("Usuario cargado")
	u.Codigo = "pablo7"
	postgres.UpdateRow(u, "codigo")
	logger.Infof("Nombre actualizado")
}
Output:

INFO: select * from personal where id='fe90b961-0646-4f8e-a698-d3a153abf7d2'
INFO: Usuario cargado
INFO: update personal set codigo='pablo7' where id='fe90b961-0646-4f8e-a698-d3a153abf7d2'
INFO: Nombre actualizado

Types

type TipoErrorSQL

type TipoErrorSQL int
const (
	NON_SQL                        TipoErrorSQL = 0
	SQL_OTHER                      TipoErrorSQL = 1
	INTEGRITY_CONSTRAINT_VIOLATION TipoErrorSQL = 2
	PL_PGSQL_RAISE_EXCEPTION       TipoErrorSQL = 3
)

func GetErrorSQL

func GetErrorSQL(err error) (TipoErrorSQL, string)

Determina el tipo de error SQL https://www.postgresql.org/docs/current/errcodes-appendix.html

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL