Warning: Undefined array key "typ" in /srv/vhost/diaridigital.net/home/html/sourcecode/main/articles.php on line 18
Helpers
Tiempo de lectura: 1 minutos
Creación de un paquete de helpers y utilidades para compartir
DB helpers
Para facilitar el acceso a la base de datos y simplificar el código he creado un paquete de helpers, de esta manera se reutiliza el código y simplifica el código de acceso a la base de datos.
Estructura
Se ubican en el directorio de paquetes, según la estructura estándar que vimos.
pkg
dbhelper
dbhelper.go
dbreaders.go dbhelper.go
En este fichero voy incluyendo las funciones de gestión de la base de datos, de momento la conexión.
package dbhelper
import (
"database/sql"
"fmt"
"os"
_ "github.com/godror/godror"
_ "github.com/sijms/go-ora/v2"
)
// --
// -----------------------------------------------
// Database helpers
// -----------------------------------------------
// Oracle connection
// Returns a db pointer
// -----------------------------------------------
func Connect_ORA(dbParams map[string]string) *sql.DB {
connectionString := "oracle://" + dbParams["username"] + ":" +
dbParams["password"] + "@" + dbParams["server"] + ":" +
dbParams["port"] + "/" + dbParams["service"]
db, err := sql.Open("oracle", connectionString)
if err != nil {
panic(fmt.Errorf("error en sql.open: %w", err))
}
// comprueba
err = db.Ping()
if err != nil {
panic(fmt.Errorf("error en verificar connexión a db: %w", err))
}
return db
}
// -----------------------------------------------
// Error handling
// -----------------------------------------------
func HandleError(msg string, err error) {
if err != nil {
fmt.Println(msg, err)
os.Exit(1)
}
} dbreaders.go
En este fichero tengo las funciones de lectura más estandarizadas. La lectura de un número y la lectura de una cadena.
package dbhelper
import (
"database/sql"
_ "github.com/godror/godror"
_ "github.com/sijms/go-ora/v2"
)
func ReadScalar(db *sql.DB, sql string) int16 {
var (
scalar int16 = 0
)
err := db.QueryRow(sql).Scan(&scalar)
HandleError("Error en lectura", err)
return scalar
}
func ReadCode(db *sql.DB, sql string) string {
var (
code string = ""
)
err := db.QueryRow(sql).Scan(&code)
HandleError("Error en lectura", err)
return code
}
imports
Los imports necesarios para que se incluya el paquete en el programa principal son los siguientes:
- interna/config - para los datos de acceso a la base de datos
- pkg/dbhelper - para cargar el paquete
import (
"database/sql"
"fmt"
"dbaccess/internal/config"
"dbaccess/pkg/dbhelper"
_ "github.com/godror/godror"
_ "github.com/sijms/go-ora/v2"
) Programa principal
Vamos ver cómo utilizamos los helpers desde el programa principal. El fichero de inicio es dbaccess.go. Primero leemos una cadena
sql := "select part_code from product_master where btg_prod_anl_0 = 'x'"
result := dbhelper.ReadCode(db, sql) A continuación leemos un precio de producto
func getBasePriceCode(db *sql.DB) float32 {
sql := "select sales_price from cv_sap_loader where price_code = '01 " +
"and part_code = '" + m_article + "'"
return dbhelper.ReadScalar(db, sql)
} Otras utilidades
También añado un directorio con utilidades que recogen funciones comunes de uso genérico. La estructura de directorios donde se ubica utils.go es la siguiente:
pkg
utils
utils.go y lo añadiremos a la lista de imports
"dbaccess/pkg/utils" utils.go
El archivo utils.go recoge todas estas funciones
package utils
import (
"os"
"os/exec"
"runtime"
)
// Limpia la pantalla del terminal
func ClearScreen() {
if runtime.GOOS == "windows" {
cmd := e x e c.Command("c m d", "/c", "cls")
cmd.Stdout = os.Stdout
cmd.Run()
} else {
cmd := exec.Command("clear")
cmd.Stdout = os.Stdout
cmd.Run()
}
}