Go语言中如何进行数据库查询操作
作者:Nil208
在Go语言中,与数据库交互通常通过使用数据库驱动来实现,Go语言支持多种数据库,如MySQL、PostgreSQL、SQLite等,每种数据库都有其对应的官方或第三方驱动,接下来通过本文给大家介绍Go语言中进行数据库查询操作方法,感兴趣的朋友跟随小编一起看看吧
查询函数QueryRow和Query详细对比
| 特性 | QueryRow | Query |
|---|---|---|
| 返回值数量 | 1个:*sql.Row | 2个:(*sql.Rows, error) |
| 错误处理时机 | 在Scan()时处理 | 立即处理 + 遍历后检查 |
| 适用场景 | 确定只有单行结果 | 可能有多行结果 |
| 资源释放 | 自动管理 | 必须手动调用rows.Close() |
| 结果遍历 | 直接调用Scan() | 循环rows.Next() + rows.Scan() |
| 空结果处理 | 返回sql.ErrNoRows | 空结果集不报错,循环0次 |
initDB() 连接数据库
package main
import (
"database/sql"
"log"
)
func initDB() {
var err error
// 设置一下dns charset:编码方式 parseTime:是否解析time类型 loc:时区
dsn := "rootname:password@tcp(127.0.0.1:3306)/table?charset=utf8&parseTime=True&loc=Local"
//rootname 和 password 和 table 是自定义的 需要自己设置数据库
db, err = sql.Open("mysql", dsn) // 打开mysql驱动
// sql.Open():
// 第一个参数:驱动名称"mysql"
// 第二个参数:DSN连接字符串
// 返回值:1.db *sql.DB:数据库连接对象指针 2.err error:错误信息
if err != nil { // 若有错误信息:
log.Fatalln(err) // log.Fatalln()会在打印错误信息后调用os.Exit(1)终止程序
}
err = db.Ping() // 用于验证DSN是否正确,数据库是否可访问,Ping()是正式连接
if err != nil {
log.Fatalln(err)
}
log.Println("Successfully connected!")
return
}main主函数
package main
import (
"database/sql" // 标准库
_ "github.com/go-sql-driver/mysql" // MySQL驱动
)
// 定义一个全局对象db
var db *sql.DB
// 定义student结构体
type student struct {
id int
name string
age int
}
func main() {
// 初始化连接
initDB()
defer db.Close() // defer关键字确保在main函数退出前执行数据库关闭操作
// 延迟执行 相当于堆在栈中 最后按照顺序出栈
// db.Close() 关闭数据库 释放资源
// 调用查询函数
queryRowDemo()
queryMultiRowDemo()
//先initDB(),再queryRowDemo(),queryMultiRowDemo(),最后db.Close()
}queryMultiRowDemo() 查询多行数据
package main
import "fmt"
func queryMultiRowDemo() {
sqlStr := "select id,name,age from student where id >?" //sql语句
rows, err := db.Query(sqlStr, 0) //Query返回值有2个:(*sql.Rows, error)
if err != nil {
fmt.Printf("scan failed, err:%v\n", err)
return
}
defer rows.Close() //用多行查询一定要关闭
for rows.Next() { //rows.Next() 移到下一行记录
//rows.Next() 在还有数据时返回 true,没有数据时返回 false
var u student
err := rows.Scan(&u.id, &u.name, &u.age) //每行数据单独处理
if err != nil {
fmt.Printf("scan failed, err:%v\n", err)
return
}
fmt.Printf("id:%d name:%s age:%v\n", u.id, u.name, u.age)
}
}queryRowDemo() 查询单行数据
package main
import "fmt"
// 查询单条数据示例
func queryRowDemo() {
sqlStr := "select id,name,age from student where id = ?"
var u student
row := db.QueryRow(sqlStr, 1) //db.QueryRow(sqlStr,1) 表示单行数据
//QueryRow 不返回error,错误在后续Scan中处理
err := row.Scan(&u.id, &u.name, &u.age) //单行查询直接Scan Scan里面是取地址
if err != nil {
fmt.Printf("Scan failed, err:%v\n", err)
return
}
fmt.Printf("id:%d,name:%s, age:%d\n", u.id, u.name, u.age)
}
//go查询数据: 先sqlStr:表示sql语句 里面有未知参数?
//var u student u表示一个结构体Student
//接下来就是套路:先用db.QueryRow函数 两个参数 一个sqlStr,另一个表示未知参数的具体值
//紧接着用Scan函数取出数据库里的值 里面的参数一定是带取地址符
//对err进行判断 最后打印以下是我自己数据库的demo

运行结果

到此这篇关于Go语言中如何进行数据库查询操作的文章就介绍到这了,更多相关go数据库查询内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
