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:
Go V1.17 o una versión posterior instalada. Consulte la documentación oficial de Go para obtener las instrucciones de descarga e instalación.
La dirección IP de su cliente agregada al Lindorm whitelist.
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 |
|
|
Sí |
— |
El endpoint de LindormTable SQL. Formato: |
|
|
Sí |
— |
El nombre de usuario de LindormTable. |
|
|
Sí |
— |
La contraseña de LindormTable. Para restablecer una contraseña olvidada, consulte Change the password. |
|
|
Sí |
— |
El nombre de la base de datos a la que desea acceder. |
|
|
No |
0 (sin tiempo de espera) |
El tiempo máximo de inactividad de las conexiones. |
|
|
No |
0 (sin límite) |
El número máximo de conexiones abiertas en el pool. |
|
|
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: