GoLang MySQL CRUD 示例

GoLang MySQL CRUD 示例

MySQL 是世界上最常用的关系数据库引擎之一。它提供了一个简单明了的界面以及与许多不同编程语言的集成。在这篇文章中,我们将使用 GoLang 连接到 MySQL。

安装 MySQL

在任何操作系统中安装 MySQL 都非常简单。它有多种安装方式。可以下载一个独立的安装程序或简单地下载一个堆栈分发安装程序,如 XAMPP。两者的工作方式相同。

安装 MySQL 后,打开命令提示符检查 MySQL 是否安装正确。

运行此命令:

1
mysql -V           

它将显示安装的 MySQL 版本,如下所示。

mysql版本
mysql版本

确保您有用户帐户设置。如果你是通过 XAMPP 安装的,那么从PHPMyAdmin就可以很容易地创建一个用户。

phpmyadmin 用户
phpmyadmin 用户

如您所见,下面是添加新用户的选项。只需添加一个具有所有权限的人。或者,您也可以使用 root,尽管它没有密码。因此,您可能需要自己设置。

所需包

要连接到 MySQL,我们需要一个驱动程序。是我们将要使用的驱动程序。要将其安装到 GOPATH 中,我们只需运行此命令。

1
go get -u https://github.com/go-sql-driver/mysql

它将安装软件包。

转到 MySQL 示例

现在,我们将看看如何在 Go 中使用 MySQL。在这里,我们使用准备好的语句。这是处理 SQL 数据库的最佳方式。

数据库结构

该数据库由以 id 作为主键的帖子、帖子名称和帖子文本组成。

因此,我们定义了将要使用的数据结构。

1
2
3
4
5
type Post struct {
    Id   int
    Name string
    Text string
}

插入数据库

首先,我们创建一个连接并检查它是否正常工作。

1
2
3
4
5
6
db, e := sql.Open("mysql", "<user>:<password>@/<databasename>")
ErrorCheck(e)
// close database after all work is done
defer db.Close()
PingDB(db)

其中ping功能如下:

1
2
3
4
func PingDB(db *sql.DB) {
    err := db.Ping()
    ErrorCheck(err)
}

错误检查功能很简单。

1
2
3
4
5
func ErrorCheck(err error) {
    if err != nil {
        panic(err.Error())
    }
}

帖子表如下所示:

插入前的帖子表
插入前的帖子表

现在,我们可以开始使用代码向其中插入数据。

1
2
3
4
5
6
7
8
9
10
11
12
13
// INSERT INTO DB
// prepare 
stmt, e := db.Prepare("insert into posts(id, Name, Text) values (?, ?, ?)")
ErrorCheck(e)
//execute
res, e := stmt.Exec("5", "Post five", "Contents of post 5")
ErrorCheck(e)
id, e := res.LastInsertId()
ErrorCheck(e)
fmt.Println("Insert id", id)
后插入
后插入

插入posts表后变为:

插入后的帖子表
插入后的帖子表

更新数据

现在,我们将更新帖子五。这是我们如何做到这一点的。

1
2
3
4
5
6
7
8
9
10
11
12
//Update db
stmt, e := db.Prepare("update posts set Text=? where id=?")
ErrorCheck(e)
// execute
res, e := stmt.Exec("This is post five", "5")
ErrorCheck(e)
a, e := res.RowsAffected()
ErrorCheck(e)
fmt.Println(a)   // 1

更新数据后,表格如下所示:

发布更新
发布更新

查询数据

现在,我们可以简单地查询所有数据。我们遍历所有行并将其放入结构中。

1
2
3
4
5
6
7
8
9
10
11
12
13
// query all data
rows, e := db.Query("select * from posts")
ErrorCheck(e)
// declare empty post variable
var post = Post{}
// iterate over rows
for rows.Next() {
    e = rows.Scan(&post.Id, &post.Name, &post.Text)
    ErrorCheck(e)
    fmt.Println(post)
}
帖子查询
帖子查询

删除数据

删除数据既简单又简单。这是一个按 id 删除的示例。

1
2
3
4
5
6
7
8
9
10
11
12
13
// delete data
stmt, e := db.Prepare("delete from posts where id=?")
ErrorCheck(e)
// delete 5th post
res, e := stmt.Exec("5")
ErrorCheck(e)
// affected rows
a, e := res.RowsAffected()
ErrorCheck(e)
fmt.Println(a)     // 1
帖子删除
帖子删除

可以看出,一切都很完美。

完整代码

package main

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

type Post struct {
Id int
Name string
Text string
}

func main() {
db, e := sql.Open(“mysql”, “rootuser:pass1234@/posts”)
ErrorCheck(e)

// close database after all work is done
defer db.Close()

PingDB(db)

// INSERT INTO DB
// prepare
stmt, e := db.Prepare(“insert into posts(id, Name, Text) values (?, ?, ?)”)
ErrorCheck(e)

//execute
res, e := stmt.Exec(“5”, “Post five”, “Contents of post 5”)
ErrorCheck(e)

id, e := res.LastInsertId()
ErrorCheck(e)

fmt.Println(“Insert id”, id)

//Update db
stmt, e := db.Prepare(“update posts set Text=? where id=?”)
ErrorCheck(e)

// execute
res, e := stmt.Exec(“This is post five”, “5”)
ErrorCheck(e)

a, e := res.RowsAffected()
ErrorCheck(e)

fmt.Println(a)

// query all data
rows, e := db.Query(“select * from posts”)
ErrorCheck(e)

var post = Post{}

for rows.Next() {
e = rows.Scan(&post.Id, &post.Name, &post.Text)
ErrorCheck(e)
fmt.Println(post)
}

// delete data
stmt, e := db.Prepare(“delete from posts where id=?”)
ErrorCheck(e)

// delete 5th post
res, e := stmt.Exec(“5”)
ErrorCheck(e)

// affected rows
a, e := res.RowsAffected()
ErrorCheck(e)

fmt.Println(a) // 1
}

func ErrorCheck(err error) {
if err != nil {
panic(err.Error())
}
}

func PingDB(db *sql.DB) {
err := db.Ping()
ErrorCheck(err)
}

发表评论

邮箱地址不会被公开。 必填项已用*标注