Utilize a biblioteca padrão database/sql do Go para se conectar ao LindormTable SQL e executar operações CRUD, sem a necessidade de um SDK cliente adicional.
Este procedimento não se aplica ao LindormTable Serverless.
Pré-requisitos
Antes de começar, verifique se você possui:
Go V1.17 ou versão posterior instalada. Consulte a documentação oficial do Go para obter instruções de download e instalação.
O endereço IP do seu cliente adicionado à lista de permissões do Lindorm.
Como funciona
O LindormTable SQL é construído sobre o Apache Calcite, portanto, o padrão sql.Open comum em drivers MySQL ou PostgreSQL não se aplica aqui. Em vez disso, utilize o conector Avatica (avatica.NewConnector) com sql.OpenDB para estabelecer a conexão.
Configure o driver do Go
**Etapa 1: Adicione o driver Avatica ao seu arquivo 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
**Etapa 2: Importe o driver no seu arquivo .go.**
import (
avatica "github.com/apache/calcite-avatica-go/v5"
)
**Etapa 3: Inicialize o pool de conexões na função 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 tabela a seguir descreve os parâmetros de conexão.
|
Parâmetro |
Obrigatório |
Padrão |
Descrição |
|
|
Sim |
— |
O endpoint do LindormTable SQL. Formato: |
|
|
Sim |
— |
O nome de usuário para o LindormTable. |
|
|
Sim |
— |
A senha para o LindormTable. Para redefinir uma senha esquecida, consulte Alterar a senha. |
|
|
Sim |
— |
O nome do banco de dados a ser acessado. |
|
|
Não |
0 (sem tempo limite) |
O tempo máximo de ociosidade das conexões. |
|
|
Não |
0 (sem limite) |
O número máximo de conexões abertas no pool. |
|
|
Não |
2 |
O número máximo de conexões ociosas no pool. |
Execute operações CRUD
Todos os exemplos abaixo utilizam o objeto db inicializado na etapa anterior.
Crie uma tabela
_, 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
}
Grave dados
Para gravações únicas, use execução direta; para gravações repetidas com valores diferentes, prefira prepared statements. Os prepared statements são analisados e otimizados apenas uma vez e reutilizados nas execuções subsequentes, o que melhora o desempenho em gravações em massa ou recorrentes.
Execução direta
_, err = db.Exec("upsert into user_test(id,name,age) values(1,'zhangsan',17)")
if err != nil {
fmt.Println("insert data error", err)
return
}
Prepared statement (recomendado para gravações 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
}
Consulte dados
Consulta direta
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)
}
Exclua dados
_, err = db.Exec("delete from user_test where id=1")
if err != nil {
fmt.Println("delete data error", err)
return
}
Próximos passos
Confira os exemplos completos e funcionais no GitHub: