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

 更新时间:2025年11月15日 09:11:20   作者:Nil208  
在Go语言中,与数据库交互通常通过使用数据库驱动来实现,Go语言支持多种数据库,如MySQL、PostgreSQL、SQLite等,每种数据库都有其对应的官方或第三方驱动,接下来通过本文给大家介绍Go语言中进行数据库查询操作方法,感兴趣的朋友跟随小编一起看看吧

查询函数QueryRow和Query详细对比

特性QueryRowQuery
返回值数量1个:*sql.Row2个:(*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数据库查询内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Go创建一个包并使用(导入本地包和注意事项)

    Go创建一个包并使用(导入本地包和注意事项)

    有时候需要自己写一个包方便多次使用,但是在导入自己写的包时遇到了问题,本文主要介绍了Go创建一个包并使用(导入本地包和注意事项),感兴趣的可以了解一下
    2023-11-11
  • Golang中make与new使用区别小结

    Golang中make与new使用区别小结

    Go语言中new和make是内建的两个函数,主要用来创建分配类型内存,本文主要给大家介绍了Go语言中函数new与make的使用和区别,具有一定的参考价值,感兴趣的可以了解一下
    2024-01-01
  • 一文带你全面掌握Go语言中的正则表达式

    一文带你全面掌握Go语言中的正则表达式

    正则表达式是一种强大的模式匹配工具,能够在文本中进行灵活的搜索和替换操作,本文将介绍 Golang 中的正则表达式语法,包括常用的匹配符号、模式修饰符以及示例应用,希望对大家有所帮助
    2023-05-05
  • 详解golang defer 闭包 匿名函数

    详解golang defer 闭包 匿名函数

    这篇文章主要介绍了golang defer 闭包 匿名函数的相关知识,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-07-07
  • go mod文件内容版本号简单用法详解

    go mod文件内容版本号简单用法详解

    这篇文章主要为大家介绍了go mod文件内容版本号简单用法详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-10-10
  • go语言题解LeetCode506相对名次示例详解

    go语言题解LeetCode506相对名次示例详解

    这篇文章主要为大家介绍了go语言题解LeetCode506相对名次示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • golang如何设置Header Content-type

    golang如何设置Header Content-type

    这篇文章主要介绍了golang如何设置Header Content-type问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • go语言中int和byte转换方式

    go语言中int和byte转换方式

    这篇文章主要介绍了go语言中int和byte转换方式,需要的朋友可以参考下
    2018-11-11
  • Go实现将io.Writer转换成字符串

    Go实现将io.Writer转换成字符串

    golang中提供了各种类型之间的转换方法,其中,将其他类型转换为字符串类型是常见的操作,本文主要介绍了Go实现将io.Writer转换成字符串,具有一定的参考价值,感兴趣的可以了解一下
    2024-05-05
  • 使用Go实现一个百行聊天服务器的示例代码

    使用Go实现一个百行聊天服务器的示例代码

    前段时间, redis作者整了个c语言版本的聊天服务器,代码量拢共不过百行,于是, 心血来潮下, 我也整了个Go语言版本, 简单来说就是实现了一个聊天室的功能,文中通过代码示例给大家介绍的非常详细,需要的朋友可以参考下
    2023-12-12

最新评论