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数据库查询内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 10个现代网站开发必备的Go软件包工具盘点

    10个现代网站开发必备的Go软件包工具盘点

    这篇文章主要为大家介绍了10个现代网站开发必备的Go软件包,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-10-10
  • golang搭建静态web服务器的实现方法

    golang搭建静态web服务器的实现方法

    这篇文章主要介绍了golang搭建静态web服务器的实现方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-08-08
  • gin+gorm实现goweb项目的示例代码

    gin+gorm实现goweb项目的示例代码

    Gorm是Go语言的ORM框架,提供一套对数据库进行增删改查的接口,本文主要介绍了gin+gorm实现goweb项目的示例代码,具有一定的参考价值,感兴趣的可以了解一下
    2025-03-03
  • Go语言实现并发控制的常见方式详解

    Go语言实现并发控制的常见方式详解

    这篇文章主要为大家详细介绍了Go语言实现并发控制的几种常见方式,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以参考一下
    2024-03-03
  • 一文详解go同步协程的必备工具WaitGroup

    一文详解go同步协程的必备工具WaitGroup

    这篇文章主要为大家介绍了一文详解go同步协程的必备工具WaitGroup使用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-03-03
  • Go构建高性能的命令行工具使例详解

    Go构建高性能的命令行工具使例详解

    这篇文章主要为大家介绍了Go构建高性能的命令行工具使例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12
  • 基于Go语言实现一个压测工具

    基于Go语言实现一个压测工具

    这篇文章主要为大家详细介绍了基于Go语言实现一个简单的压测工具,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2025-01-01
  • Go语言将string解析为time.Time时两种常见报错

    Go语言将string解析为time.Time时两种常见报错

    本文主要介绍了Go语言将string解析为time.Time时两种常见报错,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03
  • Golang sync.Pool的源码解析

    Golang sync.Pool的源码解析

    Pool是用于存放临时对象的集合,这些对象是为了后续的使用,以达到复用对象的效果,本文将详解解析sync.Pool 源码,需要的朋友可以参考下
    2023-05-05
  • golang中json操作的完全指南

    golang中json操作的完全指南

    golang标准库有一个名叫encoding/json的包,包含了JSON的序列化(Marshal)和反序列化(Unmarshal)的能力,下面这篇文章主要给大家介绍了关于golang中json操作的相关资料,需要的朋友可以参考下
    2022-07-07

最新评论