Go語言中如何進(jìn)行數(shù)據(jù)庫查詢操作
查詢函數(shù)QueryRow和Query詳細(xì)對比
| 特性 | QueryRow | Query |
|---|---|---|
| 返回值數(shù)量 | 1個:*sql.Row | 2個:(*sql.Rows, error) |
| 錯誤處理時機(jī) | 在Scan()時處理 | 立即處理 + 遍歷后檢查 |
| 適用場景 | 確定只有單行結(jié)果 | 可能有多行結(jié)果 |
| 資源釋放 | 自動管理 | 必須手動調(diào)用rows.Close() |
| 結(jié)果遍歷 | 直接調(diào)用Scan() | 循環(huán)rows.Next() + rows.Scan() |
| 空結(jié)果處理 | 返回sql.ErrNoRows | 空結(jié)果集不報錯,循環(huán)0次 |
initDB() 連接數(shù)據(jù)庫
package main
import (
"database/sql"
"log"
)
func initDB() {
var err error
// 設(shè)置一下dns charset:編碼方式 parseTime:是否解析time類型 loc:時區(qū)
dsn := "rootname:password@tcp(127.0.0.1:3306)/table?charset=utf8&parseTime=True&loc=Local"
//rootname 和 password 和 table 是自定義的 需要自己設(shè)置數(shù)據(jù)庫
db, err = sql.Open("mysql", dsn) // 打開mysql驅(qū)動
// sql.Open():
// 第一個參數(shù):驅(qū)動名稱"mysql"
// 第二個參數(shù):DSN連接字符串
// 返回值:1.db *sql.DB:數(shù)據(jù)庫連接對象指針 2.err error:錯誤信息
if err != nil { // 若有錯誤信息:
log.Fatalln(err) // log.Fatalln()會在打印錯誤信息后調(diào)用os.Exit(1)終止程序
}
err = db.Ping() // 用于驗證DSN是否正確,數(shù)據(jù)庫是否可訪問,Ping()是正式連接
if err != nil {
log.Fatalln(err)
}
log.Println("Successfully connected!")
return
}main主函數(shù)
package main
import (
"database/sql" // 標(biāo)準(zhǔn)庫
_ "github.com/go-sql-driver/mysql" // MySQL驅(qū)動
)
// 定義一個全局對象db
var db *sql.DB
// 定義student結(jié)構(gòu)體
type student struct {
id int
name string
age int
}
func main() {
// 初始化連接
initDB()
defer db.Close() // defer關(guān)鍵字確保在main函數(shù)退出前執(zhí)行數(shù)據(jù)庫關(guān)閉操作
// 延遲執(zhí)行 相當(dāng)于堆在棧中 最后按照順序出棧
// db.Close() 關(guān)閉數(shù)據(jù)庫 釋放資源
// 調(diào)用查詢函數(shù)
queryRowDemo()
queryMultiRowDemo()
//先initDB(),再queryRowDemo(),queryMultiRowDemo(),最后db.Close()
}queryMultiRowDemo() 查詢多行數(shù)據(jù)
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() //用多行查詢一定要關(guān)閉
for rows.Next() { //rows.Next() 移到下一行記錄
//rows.Next() 在還有數(shù)據(jù)時返回 true,沒有數(shù)據(jù)時返回 false
var u student
err := rows.Scan(&u.id, &u.name, &u.age) //每行數(shù)據(jù)單獨處理
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() 查詢單行數(shù)據(jù)
package main
import "fmt"
// 查詢單條數(shù)據(jù)示例
func queryRowDemo() {
sqlStr := "select id,name,age from student where id = ?"
var u student
row := db.QueryRow(sqlStr, 1) //db.QueryRow(sqlStr,1) 表示單行數(shù)據(jù)
//QueryRow 不返回error,錯誤在后續(xù)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查詢數(shù)據(jù): 先sqlStr:表示sql語句 里面有未知參數(shù)?
//var u student u表示一個結(jié)構(gòu)體Student
//接下來就是套路:先用db.QueryRow函數(shù) 兩個參數(shù) 一個sqlStr,另一個表示未知參數(shù)的具體值
//緊接著用Scan函數(shù)取出數(shù)據(jù)庫里的值 里面的參數(shù)一定是帶取地址符
//對err進(jìn)行判斷 最后打印以下是我自己數(shù)據(jù)庫的demo

運行結(jié)果

到此這篇關(guān)于Go語言中如何進(jìn)行數(shù)據(jù)庫查詢操作的文章就介紹到這了,更多相關(guān)go數(shù)據(jù)庫查詢內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
10個現(xiàn)代網(wǎng)站開發(fā)必備的Go軟件包工具盤點
這篇文章主要為大家介紹了10個現(xiàn)代網(wǎng)站開發(fā)必備的Go軟件包,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-10-10
golang搭建靜態(tài)web服務(wù)器的實現(xiàn)方法
這篇文章主要介紹了golang搭建靜態(tài)web服務(wù)器的實現(xiàn)方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-08-08
Go語言將string解析為time.Time時兩種常見報錯
本文主要介紹了Go語言將string解析為time.Time時兩種常見報錯,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03

