Go-Web基础入门教程(含源码)【第四篇】数据库编程及路由

本文是Go-Web基础入门教程的第四篇,涵盖了数据库编程和路由两个主题。在数据库编程部分,讲解了如何连接SQL数据库,包括查询、更新和删除操作,并提供了查询案例。而在路由部分,介绍了Controller层的概念,展示了如何处理路由参数,并提到了第三方路由器如gorilla/mux和httprouter的特点。
摘要由CSDN通过智能技术生成

简介

来源于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 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值