Documentation
¶
Overview ¶
Funciones de gestión para POSTGRESQL usando el driver pgxpool
Index ¶
- func AcquireConnection() (conn *pgxpool.Conn, err error)
- func CommitTX()
- func DeleteRow(id string, table string)
- func GetOneOrZeroRows(dst any, query string, params ...any) bool
- func GetOneRow(dst any, query string, params ...any)
- func GetOrderedRows(dst any, query string, params ...any)
- func InitPool(connectString string, logger *logger.Logger)
- func InsertRow(src any, especiales ...string) string
- func ReleaseConnection(conn *pgxpool.Conn)
- func RollbackTX()
- func StartTX()
- func UpdateRow(src any, especiales ...string)
- type TipoErrorSQL
Examples ¶
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
func AcquireConnection ¶
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 ¶
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 ¶
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 ¶
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 ¶
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 ¶
Conecta a la base de datos y establece el logger. Si el logger es nil, se usa el logger por defecto.
func InsertRow ¶
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 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 ¶
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