得失皆成过往 發表於 2025-11-15 09:11:20

Go语言中如何进行数据库查询操作

<h2>查询函数QueryRow和Query详细对比</h2>
<table><thead><tr><th>特性</th><th>QueryRow</th><th>Query</th></tr></thead><tbody><tr><td><strong>返回值数量</strong></td><td>1个:<code>*sql.Row</code></td><td>2个:<code>(*sql.Rows, error)</code></td></tr><tr><td><strong>错误处理时机</strong></td><td>在<code>Scan()</code>时处理</td><td>立即处理 + 遍历后检查</td></tr><tr><td><strong>适用场景</strong></td><td>确定只有单行结果</td><td>可能有多行结果</td></tr><tr><td><strong>资源释放</strong></td><td>自动管理</td><td>必须手动调用<code>rows.Close()</code></td></tr><tr><td><strong>结果遍历</strong></td><td>直接调用<code>Scan()</code></td><td>循环<code>rows.Next()</code>&nbsp;+&nbsp;<code>rows.Scan()</code></td></tr><tr><td><strong>空结果处理</strong></td><td>返回<code>sql.ErrNoRows</code></td><td>空结果集不报错,循环0次</td></tr></tbody></table>
<p>initDB()&nbsp; &nbsp;连接数据库</p>
<div class="jb51code"><pre class="brush:go;">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&amp;parseTime=True&amp;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
}</pre></div>
<p>main主函数</p>
<div class="jb51code"><pre class="brush:go;">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
        ageint
}
func main() {
        // 初始化连接
        initDB()
        defer db.Close() // defer关键字确保在main函数退出前执行数据库关闭操作
        // 延迟执行 相当于堆在栈中 最后按照顺序出栈
        // db.Close() 关闭数据库 释放资源
        // 调用查询函数
        queryRowDemo()
        queryMultiRowDemo()
        //先initDB(),再queryRowDemo(),queryMultiRowDemo(),最后db.Close()
}</pre></div>
<p>queryMultiRowDemo()&nbsp; &nbsp; 查询多行数据</p>
<div class="jb51code"><pre class="brush:go;">package main
import "fmt"
func queryMultiRowDemo() {
        sqlStr := "select id,name,age from student where id &gt;?" //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(&amp;u.id, &amp;u.name, &amp;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)
        }
}</pre></div>
<p>queryRowDemo()&nbsp; &nbsp; &nbsp;查询单行数据</p>
<div class="jb51code"><pre class="brush:go;">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(&amp;u.id, &amp;u.name, &amp;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进行判断 最后打印</pre></div>
<p>以下是我自己数据库的demo</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202511/2025111509075536.png" /></p>
<p>运行结果</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202511/2025111509075534.png" /></p>
頁: [1]
查看完整版本: Go语言中如何进行数据库查询操作