Consulta de linhas
Leia conjuntos de resultados
Consulta de linhas é uma aula grátis de Go Academy no CoddyKit. Esta é a aula 2 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.
Consultando conjuntos de resultados
Use Query para instruções que retornam linhas, como SELECT. Ele retorna um *sql.Rows que você percorre. Para um único valor, QueryRow é mais simples.
db.Query
Query envia o SQL e retorna linhas e um erro. Sempre verifique o erro antes de usar as linhas.
rows, err := db.Query("SELECT id, name FROM users WHERE active = $1", true)
if err != nil {
log.Fatal(err)
}Sempre use defer rows.Close()
As linhas mantêm uma conexão com o banco de dados até serem fechadas. defer rows.Close() devolve a conexão ao conjunto. Esquecer isso causa vazamento de conexões sob carga.
defer rows.Close()Percorrendo com rows.Next
rows.Next() avança para a próxima linha e retorna falso quando termina. Dentro do laço, chame Scan para copiar os valores das colunas para variáveis.
for rows.Next() {
var id int
var name string
if err := rows.Scan(&id, &name); err != nil {
log.Fatal(err)
}
fmt.Println(id, name)
}Scan recebe ponteiros
Scan grava nas variáveis que você passa, portanto é necessário passar ponteiros (&id, &name). O número e a ordem dos ponteiros devem corresponder às colunas selecionadas.
Verificando rows.Err
O laço pode terminar porque os dados acabaram ou porque ocorreu um erro durante a iteração. Depois do laço, chame rows.Err() para capturar qualquer erro de iteração.
if err := rows.Err(); err != nil {
log.Fatal(err)
}QueryRow para uma linha
Quando você espera exatamente uma linha, usar QueryRow com Scan é mais simples. Se nenhuma linha corresponder, Scan retorna sql.ErrNoRows.
var name string
err := db.QueryRow("SELECT name FROM users WHERE id = $1", 7).Scan(&name)
if err == sql.ErrNoRows {
fmt.Println("not found")
}Uma simulação executável de Scan
Uma consulta real precisa de um banco de dados, portanto este exemplo executável reproduz o fluxo Query, Next, Scan sobre uma fatia em memória para mostrar o padrão de iteração.
package main
import "fmt"
type Row struct {
ID int
Name string
}
func main() {
rows := []Row{{1, "Ada"}, {2, "Lin"}, {3, "Guido"}}
for i := 0; i < len(rows); i++ {
var id int
var name string
id = rows[i].ID
name = rows[i].Name
fmt.Printf("id=%d name=%s\n", id, name)
}
fmt.Println("scanned", len(rows), "rows")
}Lidando com NULL
Uma coluna NULL não pode ser lida em uma string ou um inteiro simples. Use sql.NullString, sql.NullInt64 ou um tipo ponteiro para que o código diferencie NULL de um valor vazio.
var email sql.NullString
rows.Scan(&email)
if email.Valid {
fmt.Println(email.String)
}Lendo dados em estruturas
A biblioteca padrão lê dados em variáveis individuais, não em estruturas inteiras. Você mapeia as colunas para os campos da estrutura passando &u.ID, &u.Name. Bibliotecas como sqlx automatizam esse processo.
Evite SELECT *
Liste as colunas explicitamente para que a ordem de Scan permaneça estável. Uma alteração no esquema que adicione uma coluna quebrará silenciosamente um Scan posicional se você depender de SELECT *.
Verificação rápida
Teste seus conhecimentos sobre consultas.
Recapitulação
Você aprendeu a consultar linhas:
- Query retorna *sql.Rows; use defer rows.Close()
- Faça um laço com rows.Next e copie os dados por meio de Scan para ponteiros
- Verifique rows.Err() depois do laço
- Use QueryRow para uma única linha; sql.ErrNoRows quando não houver correspondência
- Use tipos Null para colunas que aceitam valores nulos
Perguntas Frequentes
A aula “Consulta de linhas” é grátis?
Sim — o texto completo de “Consulta de linhas” é 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 “Consulta de linhas”?
Leia conjuntos de resultados 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 2 de 4.
Quanto tempo leva a aula “Consulta de linhas”?
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
- Abertura de uma conexão
- Consulta de linhas
- Instruções preparadas
- Transações