自学go,也摆脱不了CRUD的日子

社区

前言

对于外部数据库的依赖,是每种高级编程语言绕不开的话题。像Java的JDBC、Python的pymysql,都为连接数据提供了良好的解决方案。初学go,当然也要去了解一下go是如何对MySQL的连接进行封装的。

数据表

在上一篇JDBC和ORM的文章中,建了一个people表。本着不浪费就浪费的原则,这里还是用这张表来做数据库的CURD操作。

picture.image

people表里面一共三个字段:name、age、phone,共三条数据。

CRUD

同样,和Java、Python一样,想要连接数据库需要安装依赖(驱动)。go需要安装github.com/go-sql-driver/mysql模块。

go get github.com/go-sql-driver/mysql

这个就相当于JBDC中MySQL的Driver驱动。然后就开始进行CRUD操作。这里先看JDBC的流程图。

picture.image

C(增)

create,指向数据库中添加新的数据记录。在关系型数据库中,通过SQL的INSERT来实现。

package main

import (
	"database/sql"
	"fmt"
	_ "github.com/go-sql-driver/mysql"
)

func main() {
	// 设置数据库连接信息
	dsn := "root:password@tcp(175.27.xxx.xxx:3306)/test"

	// 连接数据库
	db, err := sql.Open("mysql", dsn)
	if err != nil {
		fmt.Println(err)
	}
	defer db.Close()

	// 检查数据库连接是否正常
	err = db.Ping()
	if err != nil {
		fmt.Println(err)
	}
    
 // 插入数据
 stmt, err := db.Prepare("INSERT INTO people(name, age, phone) VALUES(?, ?, ?)")
	if err != nil {
		fmt.Println(err)
	}
	defer stmt.Close()

	// 执行插入操作
	result, err := stmt.Exec("Jerry", 25, "12345678900")
	if err != nil {
		fmt.Println(err)
	}

	// 输出插入结果
	lastInsertID, err := result.LastInsertId()
	if err != nil {
		fmt.Println(err)
	}
	fmt.Println("插入成功,新记录的ID为:", lastInsertID)
	
}

这个流程和JDBC如出一辙,sql.Open加载MySQL驱动,并创建一个连接(connection),然后获取执行sql的对象(statement)来执行插入操作。运行程序,结果如下:

picture.image

在people表中新增了一条Jerry的记录。

R(读取)

Read,指从数据库中检索数据记录。这是通过SQL的SELECT语句来实现的。可以从整个表中获取数据,也可以根据特定的条件来筛选数据。加载驱动、获取连接操作和Insert如出一辙,这里只需要替换成Select操作即可。

 // 执行查询命令
	rows, err := db.Query("SELECT name, age, phone FROM people")
	if err != nil {
		fmt.Println(err)
	}
	defer rows.Close()

	// 遍历查询结果
	var (
		name string
		age  int
		phone string
	)
    
	for rows.Next() {
		err := rows.Scan(&name, &age, &phone)
		if err != nil {
			fmt.Println(err)
		}
		fmt.Println(name, age, phone)
	}

执行程序,全量查询整个表。

picture.image

U(更新)

Update,指更新数据库中现有的数据记录。这是通过SQL的UPDATE语句来实现的。更新通常需要条件来定位需要更新的记录,否则就会更新全表数据。

stmt, err := db.Prepare("UPDATE people SET age=? WHERE name=?")
	if err != nil {
		fmt.Println(err)
	}
	defer stmt.Close()

	// 更新操作
	_, err = stmt.Exec(100, "Tom")
	if err != nil {
		fmt.Println(err)
	}

	fmt.Println("数据更新成功")

执行程序,可以看到Tom已经从20岁变成了100岁。Time goes by,感叹岁月无情。

picture.image

D(删除)

Delete,指从数据库中删除数据记录。这是通过SQL的DELETE语句来实现的。删除操作一般需要指定条件,否则就会删除全表数据,就和truncate功能相同了。

stmt, err := db.Prepare("DELETE FROM people WHERE name = ?")
	if err != nil {
		fmt.Println(err)
	}
	defer stmt.Close()

	// 执行删除操作
	_, err = stmt.Exec("Jerry") 
	if err != nil {
		fmt.Println(err)
	}

	fmt.Println("数据删除成功")

通过where指定条件,删除name为Jerry的数据。执行程序,结果如下。

picture.image

结语

作为一名go的初学者,从Java的JDBC的角度来学习go更容易上手。同时在学习go连接MySQL的过程中,又认识了defer关键字,就这样吧。

0
0
0
0
评论
未登录
看完啦,登录分享一下感受吧~
暂无评论