database/sql e drivers
Configuração de DB, QueryRow, Scan e pools de conexões
database/sql e drivers é uma aula grátis de Go Academy no CoddyKit. Esta é a aula 1 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Go Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Go Academy inclui 4 aulas no total.
Visão geral de database/sql
database/sql é a camada padrão de abstração de bancos de dados do Go. Ela gerencia um pool de conexões e funciona com qualquer banco de dados por meio de um plug-in de controlador.
Registrando um controlador
Importe o pacote do controlador pelos efeitos colaterais (registro do controlador). Depois, abra uma conexão:
import _ "github.com/lib/pq" // PostgreSQL driver
db, err := sql.Open("postgres", "postgres://user:pass@localhost/mydb?sslmode=disable")
if err != nil { log.Fatal(err) }
defer db.Close()sql.Open versus db.Ping
sql.Open não se conecta — ele valida o DSN. Chame db.Ping() ou db.PingContext(ctx) para verificar se a conexão está ativa.
if err := db.Ping(); err != nil { log.Fatal(err) }Consultando linhas
Use db.QueryContext para executar um SELECT e ler as linhas:
rows, err := db.QueryContext(ctx, "SELECT id, name FROM users WHERE active = $1", true)
if err != nil { return err }
defer rows.Close()
for rows.Next() {
var id int; var name string
rows.Scan(&id, &name)
}Consulta de uma única linha
db.QueryRowContext retorna uma *Row para consultas que devem retornar no máximo um resultado:
var name string
err := db.QueryRowContext(ctx, "SELECT name FROM users WHERE id = $1", id).Scan(&name)
if errors.Is(err, sql.ErrNoRows) { /* not found */ }Executando alterações
Use db.ExecContext para INSERT, UPDATE e DELETE. Ele retorna um Result com o número de linhas afetadas e o último ID de inserção.
result, err := db.ExecContext(ctx, "INSERT INTO users(name) VALUES($1)", name)
if err != nil { return err }
id, _ := result.LastInsertId()Instruções preparadas
Prepare uma instrução uma vez e execute-a muitas vezes com eficiência:
stmt, err := db.PrepareContext(ctx, "SELECT id FROM users WHERE email = $1")
defer stmt.Close()
for _, email := range emails {
row := stmt.QueryRowContext(ctx, email)
}Configurações do pool de conexões
Configure o pool para produção:
db.SetMaxOpenConns(25)
db.SetMaxIdleConns(25)
db.SetConnMaxLifetime(5 * time.Minute)Verificando rows.Err()
Depois do loop de linhas, sempre verifique rows.Err() — o loop pode ter terminado antes por causa de um erro de rede.
if err := rows.Err(); err != nil { return err }Valores nulos
Use sql.NullString, sql.NullInt64 etc. para lidar com valores NULL do banco de dados que, de outra forma, causariam um pânico ao serem lidos em um tipo Go que não seja ponteiro.
var bio sql.NullString
rows.Scan(&bio)
if bio.Valid { fmt.Println(bio.String) }Lista de controladores
Controladores populares: github.com/lib/pq (PostgreSQL), github.com/go-sql-driver/mysql (MySQL), modernc.org/sqlite (SQLite, Go puro).
Verificação rápida
Por que você deve sempre chamar rows.Close() e verificar rows.Err() depois de uma consulta?
Recapitulação: database/sql
Pontos principais:
- Importe o controlador com _ pelos efeitos colaterais; sql.Open + Ping
- QueryContext → rows.Next + Scan + rows.Close + rows.Err
- ExecContext para alterações; QueryRowContext para linhas únicas
- SetMaxOpenConns, SetMaxIdleConns e SetConnMaxLifetime para o pool
Perguntas Frequentes
A aula “database/sql e drivers” é grátis?
Sim — o texto completo de “database/sql e drivers” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Go Academy, atualize para CoddyKit PRO. O curso de Go Academy inclui 4 aulas no total.
O que vou aprender em “database/sql e drivers”?
Configuração de DB, QueryRow, Scan e pools de conexões Você pratica Go Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar Go Academy?
Nenhuma experiência prévia é necessária. Go Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 1 de 4.
Quanto tempo leva a aula “database/sql e drivers”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de Go Academy?
Sim. Cada aula de Go Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- database/sql e drivers
- sqlx: leitura de structs e consultas nomeadas
- pgx: driver de alto desempenho para PostgreSQL
- Transações e migrações