importe os pacotes necessários, depois prepare uma struct com o mesmo esquema do exemplo da tabela tb_student no banco de dados, posteriormente esta struct será usada como container para o resultado da consulta tipo de dados.
package main import "fmt" import "database/sql" import _ "github.com/go-sql-driver/mysql" type student struct { id string, name string, age int, grade int, }
O driver de banco de dados utilizado precisa ser importado usando o sinal _, pois mesmo sendo necessário pelo pacote banco de dados/sql, não interagimos diretamente com o driver.
Em seguida, crie uma função para conectar-se ao banco de dados.
func connect() (*sql.DB, error) { db, err := sql.Open("mysql","root:@tcp(127.0.0.1:3306)/db_learn_go") if err != nil { return nil, err } return db, nil }
O esquema de string de conexão para o driver mysql que usamos é bastante exclusivo, root@tcp(127.0.0.1:3306)/db_learn_go abaixo é um esquema de string de conexão que pode ser usado em qualquer lugar do driver MYSQL Driver, se você usar outro mysql, o esquema de conexão pode ser diferente dependendo do driver utilizado.
user:password@tcp(host:port)/dbname user@tcp(host:port)/dbname
Abaixo está uma explicação da string de conexão usada na função connect().
root@tcp(127.0.0.1:3306)/db_learn_go // user => root // password => // host => 127.0.0.1 atau localhost // port => 3306 // dbname => db_learn_go
Depois de criada a função de conectividade com o banco de dados, é hora de praticar o processo de leitura de dados do servidor de banco de dados. Prepare a função
sqlQuery() com o seguinte código.
func sqlQuery() { db, err := connect() if err != nil { fmt.Println(err.Error()) return } defer db.Close() var age = 27 rows, err := db.Query("select id, name, grade from tb_student where age = ? if err != nil { fmt.Println(err.Error()) return } defer rows.Close() var result []student for rows.Next() { var each = student{} var err = rows.Scan(&each.id, &each.name, &each.grade) if err != nil { fmt.Println(err.Error()) return } result = append(result, each) } if err = rows.Err(); err != nil { fmt.Println(err.Error()) return } for _, each := range result { fmt.Println(each.name) } }
Cada vez que uma nova conexão for criada, não se esqueça de sempre fechar a instância da conexão. Você pode usar a palavra-chave defer como no código acima, defer
db.Fechar() .
A função db.Query() é usada para executar consultas SQL. O segundo parâmetro da função é variável, portanto pode ser deixado em branco. No código acima, você pode ver que o valor de uma das cláusulas where é um ponto de interrogação (?).
O sinal será então substituído pelo valor do parâmetro após ele (o valor da variável idade). Este tipo de técnica de escrita de consulta é altamente recomendada para evitar injeção de SQL. A função produz uma instância do tipo sql.*Rows , que também precisa ser fechada quando não for mais usada ( defer rows.Close() ). A seguir, um array com o tipo de elemento struct student é preparado com o nome result . Posteriormente, os resultados da consulta serão armazenados na variável. Em seguida, um loop é executado com a referência da condição sendo rows.Next() . Este loop é executado tantas vezes quanto o número total de registros, sequencialmente do primeiro ao final, um por um. O método Scan() de sql.Rows funciona para recuperar o valor do registro que está sendo iterado, para ser armazenado em uma variável de ponteiro. As variáveis utilizadas para armazenar os campos do registro são escritas sequencialmente como parâmetros variáveis, de acordo com os campos selecionados na consulta. Por favor, veja a comparação abaixo para mais detalhes. // consulta
selecione id, nome, nota ...
// Varredura
linhas.Scan(&each.id, &each.nome, &each.grade ...
Os dados do registro obtidos são então anexados à fatia de resultado, por meio da instrução
resultado = anexar(resultado, cada).
OK, agora basta chamar a função sqlQuery() em main e executar o programa.
func main() {
sqlQuery()
}
Sou apenas um escritor de blog comum. Se ainda houver muitas deficiências, por favor, me perdoe.
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3