跳到主要内容

Go 数据库连接

在现代Web开发中,数据库是不可或缺的一部分。Go语言提供了强大的标准库和第三方库,使得与数据库的交互变得简单而高效。本文将带你了解如何在Go中连接数据库,并通过实际案例展示其应用。

介绍

在Go中,数据库连接通常通过database/sql包来实现。这个包提供了一个通用的接口,用于与各种关系型数据库进行交互。为了连接到具体的数据库(如MySQL、PostgreSQL等),我们需要使用相应的数据库驱动。

安装数据库驱动

首先,我们需要安装一个数据库驱动。以MySQL为例,我们可以使用github.com/go-sql-driver/mysql驱动。

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

连接到数据库

接下来,我们来看如何连接到MySQL数据库。

go
package main

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

func main() {
// 数据库连接字符串
dsn := "username:password@tcp(127.0.0.1:3306)/dbname"

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

// 测试连接
err = db.Ping()
if err != nil {
panic(err.Error())
}

fmt.Println("成功连接到数据库!")
}
备注

请确保将usernamepassworddbname替换为实际的数据库用户名、密码和数据库名称。

执行查询

连接到数据库后,我们可以执行SQL查询。以下是一个简单的查询示例:

go
func queryData(db *sql.DB) {
rows, err := db.Query("SELECT id, name FROM users")
if err != nil {
panic(err.Error())
}
defer rows.Close()

for rows.Next() {
var id int
var name string
err = rows.Scan(&id, &name)
if err != nil {
panic(err.Error())
}
fmt.Printf("ID: %d, Name: %s\n", id, name)
}
}

插入数据

除了查询,我们还可以插入数据到数据库中。

go
func insertData(db *sql.DB) {
stmt, err := db.Prepare("INSERT INTO users(name) VALUES(?)")
if err != nil {
panic(err.Error())
}
defer stmt.Close()

result, err := stmt.Exec("John Doe")
if err != nil {
panic(err.Error())
}

lastInsertId, err := result.LastInsertId()
if err != nil {
panic(err.Error())
}

fmt.Printf("插入成功,ID: %d\n", lastInsertId)
}

实际案例

假设我们正在开发一个简单的用户管理系统,我们需要从数据库中获取用户列表,并将新用户添加到数据库中。以下是一个完整的示例:

go
package main

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

func main() {
dsn := "username:password@tcp(127.0.0.1:3306)/dbname"
db, err := sql.Open("mysql", dsn)
if err != nil {
panic(err.Error())
}
defer db.Close()

err = db.Ping()
if err != nil {
panic(err.Error())
}

fmt.Println("成功连接到数据库!")

queryData(db)
insertData(db)
}

func queryData(db *sql.DB) {
rows, err := db.Query("SELECT id, name FROM users")
if err != nil {
panic(err.Error())
}
defer rows.Close()

for rows.Next() {
var id int
var name string
err = rows.Scan(&id, &name)
if err != nil {
panic(err.Error())
}
fmt.Printf("ID: %d, Name: %s\n", id, name)
}
}

func insertData(db *sql.DB) {
stmt, err := db.Prepare("INSERT INTO users(name) VALUES(?)")
if err != nil {
panic(err.Error())
}
defer stmt.Close()

result, err := stmt.Exec("John Doe")
if err != nil {
panic(err.Error())
}

lastInsertId, err := result.LastInsertId()
if err != nil {
panic(err.Error())
}

fmt.Printf("插入成功,ID: %d\n", lastInsertId)
}

总结

通过本文,我们学习了如何在Go中连接数据库,并执行基本的查询和插入操作。database/sql包为我们提供了一个通用的接口,使得与各种数据库的交互变得简单而高效。

附加资源

练习

  1. 尝试连接到PostgreSQL数据库,并执行类似的查询和插入操作。
  2. 修改代码,使其能够处理数据库连接错误,并给出友好的错误提示。
  3. 编写一个函数,用于更新和删除数据库中的记录。

通过完成这些练习,你将更深入地理解Go中的数据库操作。