简介
来源于B站视频,知识点整理的第四篇包含数据库编程及路由部分
课程视频
如需查看上篇内容请看:
Go-Web基础入门教程(含源码)【第三篇】
Go Web
Web是基于http协议的一个服务,Go语言里面提供了一个完善的net/http包,通过http包可以很方便的就搭建起来一个可以运行的Web服务。
补充 - Go数据库编程
如果没有下载数据库相关的引用,则需要在控制台输入
go get github.com/go-sql-driver/mysql
package main
import (
"context"
"database/sql"
"fmt"
"log"
_ "github.com/go-sql-driver/mysql"
)
var db *sql.DB
const (
server = "127.0.0.1"
port = 3306
user = "root"
password = "root"
database = "eesy"
)
func main() {
// 需要改成你自己数据库的配置
db, _ := sql.Open("mysql", "db:db@(127.0.0.1:3306)/dbname")
err := db.Ping()
if err != nil {
log.Fatalln(err.Error())
}
defer db.Close()
ctx := context.Background()
err = db.PingContext(ctx)
if err != nil {
log.Fatalln(err.Error())
}
fmt.Println("Connected!")
}
想要连接SQL数据库,首先需要加载目标数据库的驱动,驱动中包含着与该数据库交互的逻辑.
sql.Open()
- 数据库驱动的名称
- 数据源的名称
- 得到一个指向sql.DB这个strcut的指针
- sql.DB对象对于多个 goroutine 并发使用是安全的
sql.DB是用来操作数据库的,实际上代表了0个或者多个底层连接池,这些连接由SQL包来维护,SQL包会自动创建和释放这些连接.
如何获取驱动?
正常的做法是通过sql.Register()
函数,数据库驱动的名称以及一个实现了driver.Driver
接口的struct来注册数据库的驱动.例如:
sql.Register("mysql", &drv{})
驱动的自动注册概念
- 当
go-sql-driver/mysql
包被引入的时候,它的init
函数会运行并且进行自我注册 - 在引入包的开始位置使用
_
是因为我们不直接使用数据库驱动,只使用database/sql
- 这样设计的好处在于即使驱动需要升级也无需改变代码
- Go语言没有提供官方的数据库驱动,所有的数据库驱动都是第三方驱动,它们都遵循
sql.driver
包里面定义的接口
SQL - 查询
- sql.DB类型上用于查询的方法:
Query
把查询SQL语句发送到数据库QueryRow
适用于只有一条记录的方法QueryContext
:携带上下文信息QueryRowContext
:携带上下文信息
Query
方法:
QueryRow
方法:
案例使用的数据库表结构如下:
表中的数据如下:
案例一:查询演练
案例总共包含三个文件分别是:model.go
+ service.go
+ main.go
// model.go
package main
type user struct {
Id int
username string
pwd string
}
// service.go
package main
import (
"log"
)
// 查询单一结果
func getOne(id int) (u user, err error) {
u = user{
}
log.Println(db == nil)
err = db.QueryRow("SELECT id, username, password FROM user WHERE id = ?", id).Scan(
&u.Id, &u.username, &u.pwd)
return
}
// 查询多个结果
func getMany(id int) (us []user, err error) {
// 返回类型为 sql.Rows - 可以理解为一个迭代器
rows, err := db.Query("SELECT id, username, password FROM user WHERE id > ?", id)
for rows.Next() {
u := user{
}
err