En este artículo, enumero cómo realizar operaciones comunes de bases de datos SQL con Go.
- Presentando
database/sql
- Abra la conexión a la base de datos
- Cerrar la conexión a la base de datos
- Extraer datos de la base de datos
Presentandodatabase/sql
Go ofrece una API limpia de base de datos SQL en su biblioteca estándardatabase/sql
paquete, pero los controladores de base de datos específicos deben instalarse por separado.
Es un enfoque inteligente porque proporciona una interfaz común que implementan casi todos los controladores de base de datos.
Si desea utilizar MySQL, puede utilizarhttps://github.com/go-sql-driver/mysql.
Si está usando PostgreSQL, usehttps://github.com/lib/pq.
Solo necesitas incluir la lib usandoimport _
, y eldatabase/sql
La API se configurará para habilitar ese controlador:
import "database/sql"
import _ "github.com/go-sql-driver/mysql"
Abra la conexión a la base de datos
Aunque el objetivo es abstraerlo, todavía existen diferencias en algunas cosas, por ejemplo, en cómo se conecta a una base de datos:
import "database/sql"
import _ "github.com/go-sql-driver/mysql"
//…
db, err := sql.Open(“mysql”, “theUser:[email protected]/theDbName”)
if err != nil {
panic(err)
}
import “database/sql”
import _ “github.com/lib/pq”
//…
db, err := sql.Open(“postgres”, “user=theUser dbname=theDbName sslmode=verify-full”)
if err != nil {
panic(err)
}
pero gran parte de la API real es independiente de la base de datos y se puede intercambiar con bastante facilidad (aquí no se habla de SQL, solo se hace referencia a la API de la base de datos).
Cerrar la conexión a la base de datos
Cuando tenga sentido, siempre debe cerrar la conexión a la base de datos.
Puede usarlo como de costumbredefer
para cerrarlo cuando finalice la función que abre la conexión db:
db, err := sql.Open("postgres", psqlInfo)
defer db.Close()
Extraer datos de la base de datos
Seleccione una sola fila
La consulta de una tabla se realiza en 2 pasos. Primero llamasdb.QueryRow()
, entonces llamasScan()
en el resultado.
Ejemplo:
id := 1
var col string
sqlStatement := `SELECT col FROM my_table WHERE id=$1`
row := db.QueryRow(sqlStatement, id)
err := row.Scan(&col)
if err != nil {
if err == sql.ErrNoRows {
fmt.Println("Zero rows found")
} else {
panic(err)
}
}
db.QueryRow()
se utiliza para consultar un solo valor de una tabla.
Firma:
func (db *DB) QueryRow(query string, args ...interface{}) *Row
Devuelve un puntero a undb.Row
valor.
(*Row) Scan
escanea la fila, copiando los valores de la columna al parámetro que se le ha pasado.
Firma:
func (r *Row) Scan(dest ...interface{}) error
Si se devolvió más de una fila, solo escanea la primerae ignore el resto.
Si no se devolvió ninguna fila, devuelve unErrNoRows
error.
var ErrNoRows = errors.New("sql: no rows in result set")
Seleccionar varias filas
Para consultar una sola fila usamosdb.QueryRow()
. Para consultar varias filas usamosdb.Query()
, que devuelve un*Rows
valor.
De los documentos:
//Rows is the result of a query. Its cursor starts before the first row of the result set. Use Next to advance through the rows:
rows, err := db.Query("SELECT ...")
...
defer rows.Close()
for rows.Next() {
var id int
var name string
err = rows.Scan(&id, &name)
...
}
err = rows.Err() // get any error encountered ing iteration
...
// Err devuelve el error, si lo hay, que se encontró durante la iteración. // Se puede llamar a Err después de un cierre explícito o implícito.
Necesitamos iterar sobrerows.Next()
, que nos permite llamarrows.Scan()
en el bucle.
Si surge algún error al preparar la siguiente fila, el ciclo finaliza y podemos obtener el error llamandorows.Err()
:
type Timeline struct {
Id int
Content string
}
rows, err := db.Query(`SELECT id, content FROM timeline`)
if err != nil {
panic(err)
}
defer rows.Close()
for rows.Next() {
timeline := Timeline{}
err = rows.Scan(&timeline.Id, &timeline.Content)
if err != nil {
panic(err)
}
fmt.Println(timeline)
}
err = rows.Err()
if err != nil {
panic(err)
}
Más tutoriales de go:
- Uso de NGINX Reverse Proxy para brindar servicios de Go
- Hacer una copia de una estructura en Go
- Los conceptos básicos de un servidor web Go
- Ordenar un tipo de mapa en Go
- Ir consejos en pocas palabras
- Explicación de las etiquetas Go
- Ir al formato de fecha y hora
- Procesamiento JSON con Go
- Ir a funciones variadas
- Hoja de referencia de Go Strings
- Explicación de la interfaz Go Empty
- Depuración de Go con VS Code y Delve
- Parámetros de devoluciones de Go Named
- Generación de cadenas y números aleatorios en Go
- Estructura del sistema de archivos de un proyecto de Go
- Algoritmo de búsqueda binaria implementado en Go
- Uso de indicadores de línea de comando en Go
- GOPATH explicado
- Cree una aplicación de línea de comandos con Go: lolcat
- Construyendo un comando CLI con Go: cowsay
- Uso de Shell Pipes con Go
- Tutorial de Go CLI: clon de la fortuna
- Enumere los archivos en una carpeta con Go
- Use Ir para obtener una lista de repositorios de GitHub
- Ve, agrega un trozo de cadenas a un archivo
- Ve, convierte una cadena en un segmento de bytes
- Visualice sus contribuciones locales de Git con Go
- Introducción a la creación de perfiles de memoria y CPU de Go
- Resolver el error "no admite la indexación" en un programa Go
- Medir el tiempo de ejecución en un programa Go
- Creación de un rastreador web con Go para detectar títulos duplicados
- Siga las mejores prácticas: ¿puntero o receptores de valor?
- Siga las mejores prácticas: ¿Debería utilizar un método o una función?
- Ir a estructuras de datos: Establecer
- Hoja de referencia de Go Maps
- Genere implementaciones para tipos genéricos en Go
- Ir a estructuras de datos: diccionario
- Ir a estructuras de datos: tabla hash
- Implementar oyentes de eventos en canales de paso
- Ir a estructuras de datos: apilar
- Ir a estructuras de datos: cola
- Ir a estructuras de datos: árbol de búsqueda binaria
- Ir a estructuras de datos: gráfico
- Ir a estructuras de datos: lista vinculada
- La guía completa de Go Data Structures
- Comparación de valores de Go
- ¿Go está orientado a objetos?
- Trabajar con una base de datos SQL en Go
- Usar variables de entorno en Go
- Ir al tutorial: API REST respaldada por PostgreSQL
- Habilitación de CORS en un servidor web Go
- Implementación de una aplicación Go en un contenedor Docker
- Por qué Go es un lenguaje poderoso para aprender como desarrollador PHP
- Ve, elimina el carácter de nueva línea io.Reader.ReadString
- Ir, cómo ver los cambios y reconstruir su programa
- Ve, cuenta los meses desde una fecha
- Acceder a los parámetros HTTP POST en Go