Go语言中MySQL数据库的初始化与使用指南:从安装到数据管理
我以GO语言介绍了内存存储和文件存储。文件存储的优点是它可以持久数据,但是它不是Web应用程序中数据存储的最终解决方案,因为以这种方式存储的数据非常麻烦地检索和管理。这诞生了一个数据库管理系统,以处理数据添加,删除,修改和搜索。数据库也可以分为关系数据库(RDBMS)和非关系数据库(NOSQL)。前者是Mysql和Oracle,后者如Redis和Mongodb。在这里,我们将以最流行的开源关系数据库MySQL介绍它们。

1。初始化数据库
在开始之前,我们需要连接到MySQL Server以初始化数据库和数据表。
注意:如果您尚未在本地安装MySQL数据库,则需要先安装它。使用Docker启动它或下载安装软件包将其安装在MySQL官方网站上。您也可以使用自制酿造将其安装在Mac系统中,然后选择一个喜欢的产品。表格在本地使用。
通过上述准备连接到MySQL Server后,您可以创建一个名为Test_db的数据库:
然后在此数据库中创建一个称为帖子的测试数据表以存储文章信息:
CREATE TABLE `posts` (
`id` bigint unsigned AUTO_INCREMENT,
`title` varchar(100) DEFAULT NULL,
`content` text,
`author` varchar(30) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `id` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
2。建立数据库连接
接下来,我们可以在GO程序中编写代码以建立与数据库的连接,然后添加,删除,修改和检查Posts表。
GO语言不提供MySQL客户端扩展程序包的官方实现,而仅提供抽象的数据库/SQL接口。只要第三方数据库客户端实现声明接口的方法,用户就可以将其扩展到不同的第三方数据库客户端。在包装实现之间切换,而无需调整任何业务代码。
有许多MySQL第三方扩展程序包可以实现数据库/SQL接口,更受欢迎的界面包括GO-SQL-DRIVER/MYSQL和ORM Extension软件包GO-GOR/GORM。首先,让我们看一下如何使用GO-SQL-DRIVER/MYSQL与程序中的MySQL数据库进行互动。
我们可以在测试代码db.go中编写一个初始方法,并在每个代码执行主条目函数之前建立数据库连接:
import (
"database/sql"
_ "github.com/go-sql-driver/mysql"
)
var Db *sql.DB
func init() {
var err error
Db, err = sql.Open("mysql", "root:root@/test_db?charset=utf8mb4&parseTime=true")
if err != nil {
panic(err)
}
}
SQL.DB是一种用于操作数据库并维护数据库连接池的结构。数据库连接是通过SQL.open方法设置的,该方法接收数据库驱动程序(这是MySQL)和数据源名称字符串(根据位置填写。有关更多详细信息,请参阅数据库软件包的官方文档):
[username[:password]@][protocol[(address)]]/dbname[?param1=value1&...¶mN=valueN]
注意:如果MySQL Server在本地运行,则地址字段(IP +端口号)是空白的。
成功后,返回SQL.DB指针,然后您可以使用此指针操作数据库。
应该注意的是,开放方法并不能真正建立连接,也没有对传入参数进行任何验证。它仅负责初始化sql.db结构字段。只有在以后真正需要时,才能建立数据库连接。懒惰的加载过程。这样做的优点是提高应用程序性能并避免不必要的数据库连接开销。
此外,SQL.DB不需要关闭。 SQL.DB维护一个连接池。在我们的示例代码中,定义了全局DB变量指向它。您也可以在创建SQL.DB之后将其传递给它,以操作数据库。
接下来,让我们看一下开放方法的参数。第一个参数是数据库驱动程序。要支持此驱动程序,您需要调用SQL.Register方法进行注册。由于我们使用第三方软件包go-sql-driver/mysql,因此这一步骤是在MySQL软件包(driver.go)的INIT方法中完成的:
func init() {
sql.Register("mysql", &MySQLDriver{})
}
SQL软件包的驱动程序界面的背后驱动程序结构需要实现驱动程序。
当我们通过以下代码介绍MySQL软件包时:
_ "github.com/go-sql-driver/mysql"
MySQL软件包的初始方法将被调用。
GO不提供任何数据库驱动程序软件包,而仅声明SQL.Driver中的接口。第三方驱动程序包仅需要实现这些接口。此外,在导入第三方软件包时,我们需要在其前面添加一条仪表板线。这样做的优点是,我们不会直接使用第三方软件包中的方法,并且我们只能使用官方数据库/SQL中提供的方法。升级第三方软件包或需要调整数据库驱动程序时,无需修改应用程序中的代码。
注意:如果您不清楚此接口和实现的详细信息,则可以对其进行审查。
3。添加,删除,修改和搜索示例代码
数据库初始化完成并设置了连接配置后,您可以与GO应用程序中的数据库进行交互。我们将编写一个示例代码以添加,删除,修改和搜索文章表以演示GO中的数据库操作。
注意:以下所有示例代码均以db.go编写。
定义邮政结构
首先,我们需要定义代表文章表的数据结构的结构:
type Post struct {
Id int
Title string
Content string
Author string
}
创建新文章
然后,我们编写创建方法以在数据库中创建文章记录。实际上,我们在上述全局数据库连接上执行SQL插入语句。相应的示例代码如下:
func (post *Post) Create() (err error) {
sql := "insert into posts (title, content, author) values (?, ?, ?)"
stmt, err := Db.Prepare(sql)
if err != nil {
panic(err)
}
defer stmt.Close()
res, err := stmt.Exec(post.Title, post.Content, post.Author)
if err != nil {
panic(err)
}
postId, _ := res.LastInsertId()
post.Id = int(postId)
return
}
注意:我们在此处使用预处理语句以避免SQL注入攻击。如果您有针对PHP或其他语言数据库的基本编程基础,则应该很容易理解这些代码。
实际上,我们还可以通过stmt.queryrow(post.title,post.cont.content,post.author)执行插入操作。效果是相同的。您也可以直接通过db.exec执行插入操作:
res, err := Db.Exec(sql, post.Title, post.Content, post.Author)
收到一篇文章
创建文章后,您可以执行SQL查询语句查询单个记录,并通过DB.Queryrow将结果映射到帖子结构。
func GetPost(id int) (post Post, err error) {
post = Post{}
err = Db.QueryRow("select id, title, content, author from posts where id = ?", id).
Scan(&post.Id, &post.Title, &post.Content, &post.Author)
return
}
获取文章清单
我们可以使用sql.db提供的查询方法来查询多个文章记录:
func Posts(limit int) (posts []Post, err error) {
rows, err := Db.Query("select id, title, content, author from posts limit ?", limit)
if err != nil {
panic(err)
}
defer rows.Close()
for rows.Next() {
post := Post{}
err = rows.Scan(&post.Id, &post.Title, &post.Content, &post.Author)
if err != nil {
panic(err)
}
posts = append(posts, post)
}
return
}
此方法返回SQL.Rows界面,即迭代器,您可以通过循环调用其下一个方法来调用其下一个方法以返回其中的每个SQL.ROW对象,直到SQL.Rows中的记录值为空(这次是为了)返回IO。
在循环主体中,我们将每个SQL.ROW对象映射到帖子对象,然后将此帖子对象添加到帖子切片中。
实际上,单一记录也可以以类似的方式实现。毕竟,单个记录查询是选择查询的特殊情况:
func GetPost(id int) (post Post, err error) {
rows, err := Db.Query("select id, title, content, author from posts where id = ? limit 1", id)
if err != nil {
panic(err)
}
defer rows.Close()
for rows.Next() {
post = Post{}
err = rows.Scan(&post.Id, &post.Title, &post.Content, &post.Author)
if err != nil {
panic(err)
}
}
return
}
当然,以前的db.query也可以调整为预处理声明实现,但更麻烦:
stmt, err := Db.Prepare("select id, title, content, author from posts limit ?")
if err != nil {
panic(err)
}
defer stmt.Close()
rows, err := stmt.Query(limit)
if err != nil {
panic(err)
}
... // 后续其他操作代码
更新文章
对于现有文章记录,您可以通过执行SQL Update语句进行修改:
func (post *Post) Update() (err error) {
stmt, err := Db.Prepare("update posts set title = ?, content = ?, author = ? where id = ?")
if err != nil {
return
}
stmt.Exec(post.Title, post.Content, post.Author, post.Id)
return
}
当然,您也可以使用stmt.queryrow和db.exec来处理上述操作。 db.exec方法更简洁:
func (post *Post) Update() (err error) {
_, err = Db.Exec("update posts set title = ?, content = ?, author = ? where id = ?",
post.Title, post.Content, post.Author, post.Id)
return
}
DB.EXEC方法返回SQL.Result接口,该接口支持以下两个方法:
-W632
我们不需要处理这个结果对象,因此请通过_忽略它。
删除文章
删除类似于更新,但仅将更新语句调整为删除语句:
func (post *Post) Delete() (err error) {
stmt, err := Db.Prepare("delete from posts where id = ?")
if err != nil {
return
}
stmt.Exec(post.Id)
return
}
当然,可以通过stmt.queryrow或db.exec方法实施上述操作:
func (post *Post) Delete() (err error) {
_, err = Db.Exec("delete from posts where id = ?", post.Id)
return
}
4。总体测试
最后,我们在db.go中编写输入函数主,以测试上述数据库添加,删除,修改和检查操作是否可以正常运行:
func main() {
post := Post{Title: "Go 语言数据库操作", Content: "基于第三方 go-sql-driver/mysql 包实现 MySQL 数据库增删改查", Author: "学院君"}
// 创建记录
post.Create()
fmt.Println(post)
// 获取单条记录
dbPost, _ := GetPost(post.Id)
fmt.Println(dbPost)
// 更新记录
dbPost.Title = "Golang 数据库操作"
dbPost.Update()
// 获取文章列表
posts, _ := Posts(1)
fmt.Println(posts)
// 删除记录
dbPost.Delete()
}
注意:在运行之前,请记住通过GO模块下载GO-SQL-DRIVER/MYSQL依赖关系。
在终端中运行DB.GO,输出如下,表明用于添加,删除,修改和搜索此数据库的代码可以正常运行:
好的,让我们简要介绍添加,删除,修改和搜索数据库的基本操作。在下一个教程中,让我们看一下MySQL数据库中不同表之间的相关查询和更新。
(全文结束)