Todos los productos
Search
Centro de documentos

Lindorm:Uso de las API de la biblioteca database/sql de Go para desarrollar aplicaciones

Última actualización: Sep 05, 2026

Utilice la biblioteca estándar database/sql de Go para conectarse a LindormTable SQL y ejecutar operaciones CRUD. No se requiere ningún SDK de cliente adicional.

Este procedimiento no aplica para LindormTable Serverless.

Requisitos previos

Antes de empezar, asegúrese de contar con lo siguiente:

Funcionamiento

LindormTable SQL está basado en Apache Calcite; por ello, el patrón estándar sql.Open que se usa con los controladores de MySQL o PostgreSQL no aplica en este caso. En su lugar, utilice el conector Avatica (avatica.NewConnector) junto con sql.OpenDB para establecer la conexión.

Configuración del controlador de Go

**Paso 1: Agregue el controlador Avatica a su archivo go.mod.**

require github.com/apache/calcite-avatica-go/v5 v5.0.0
replace github.com/apache/calcite-avatica-go/v5 => github.com/aliyun/alibabacloud-lindorm-go-sql-driver/v5 v5.0.6

**Paso 2: Importe el controlador en su archivo .go.**

import (
    avatica "github.com/apache/calcite-avatica-go/v5"
)

**Paso 3: Inicialice el pool de conexiones en la función main.**

databaseUrl := "http://localhost:30060"

conn := avatica.NewConnector(databaseUrl).(*avatica.Connector)
conn.Info = map[string]string{
    "user":     "sql",
    "password": "test",
    "database": "default",
}
db := sql.OpenDB(conn)

// Configure connection pool settings
db.SetConnMaxIdleTime(8 * time.Minute)
db.SetMaxOpenConns(20)
db.SetMaxIdleConns(2)

A continuación se describen los parámetros de conexión.

Parámetro

Obligatorio

Predeterminado

Descripción

databaseUrl

Sí

—

El endpoint de LindormTable SQL. Formato: http://<endpoint>:30060. Para obtener su endpoint, consulte View the endpoints of LindormTable.

user

Sí

—

El nombre de usuario de LindormTable.

password

Sí

—

La contraseña de LindormTable. Para restablecer una contraseña olvidada, consulte Change the password.

database

Sí

—

El nombre de la base de datos a la que desea acceder.

SetConnMaxIdleTime

No

0 (sin tiempo de espera)

El tiempo máximo de inactividad de las conexiones.

SetMaxOpenConns

No

0 (sin límite)

El número máximo de conexiones abiertas en el pool.

SetMaxIdleConns

No

2

El número máximo de conexiones inactivas en el pool.

Ejecución de operaciones CRUD

Todos los ejemplos siguientes utilizan el objeto db inicializado en el paso anterior.

Creación de una tabla

_, err := db.Exec("create table if not exists user_test(id int, name varchar, age int, primary key(id))")
if err != nil {
    fmt.Println("create table error", err)
    return
}

Escritura de datos

Para escrituras únicas, utilice la ejecución directa. Si necesita escribir de forma repetida con valores distintos, emplee una sentencia preparada. Las sentencias preparadas se analizan y optimizan una sola vez, y luego se reutilizan en cada ejecución. Esto mejora el rendimiento en escrituras masivas o repetitivas.

Ejecución directa

_, err = db.Exec("upsert into user_test(id,name,age) values(1,'zhangsan',17)")
if err != nil {
    fmt.Println("insert data error", err)
    return
}

Sentencia preparada (recomendada para escrituras repetidas)

stmt, err := db.Prepare("upsert into user_test(id,name,age) values(?,?,?)")
if err != nil {
    fmt.Println("prepare error", err)
    return
}
_, err = stmt.Exec(1, "zhangsan", 17)
if err != nil {
    fmt.Println("upsert error", err)
    return
}

Consulta de datos

Consulta directa

rows, err := db.Query("select * from user_test")
if err != nil {
    fmt.Println("query data error", err)
    return
}
defer rows.Close() // Always close rows to avoid connection leaks.
var id int
var name string
var age int
for rows.Next() {
    err = rows.Scan(&id, &name, &age)
    if err != nil {
        fmt.Println("scan data error", err)
        return
    }
    fmt.Println("id:", id, "name:", name, "age:", age)
}

Consulta parametrizada (recomendada para consultas repetidas)

stmt, err = db.Prepare("select * from user_test where id=?")
if err != nil {
    fmt.Println("prepare error", err)
    return
}
rows, err := stmt.Query(1)
if err != nil {
    fmt.Println("query data error", err)
    return
}
defer rows.Close() // Always close rows to avoid connection leaks.
var id int
var name string
var age int
for rows.Next() {
    err = rows.Scan(&id, &name, &age)
    if err != nil {
        fmt.Println("scan data error", err)
        return
    }
    fmt.Println("id:", id, "name:", name, "age:", age)
}

Eliminación de datos

_, err = db.Exec("delete from user_test where id=1")
if err != nil {
    fmt.Println("delete data error", err)
    return
}

Pasos siguientes

Revise los ejemplos funcionales completos en GitHub: