0Pricing
Go Academy · Aula

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

  1. Abertura de uma conexão
  2. Consulta de linhas
  3. Instruções preparadas
  4. Transações
← Voltar para Go Academy