使用数据库/SQL库
5.1 Go标准库中的数据库/SQL包(database/sql
)
Go 语言的 database/sql
包提供了与 SQL 数据库交互的通用接口。它不包含任何数据库驱动程序,但可以与各种数据库驱动程序一起使用。
5.1.1 导入 database/sql
包
要使用 database/sql
包,需要首先导入它:
import (
"database/sql"
_ "github.com/go-sql-driver/mysql" // 导入 MySQL 驱动程序
)
5.2 SQL驱动程序(MySQL、PostgreSQL、SQLite等)
为了连接特定的数据库,您需要相应的驱动程序。以下是一些常用的数据库驱动程序:
5.2.1 MySQL 驱动程序
MySQL 驱动程序可以通过 github.com/go-sql-driver/mysql
导入。
import _ "github.com/go-sql-driver/mysql"
5.2.2 PostgreSQL 驱动程序
PostgreSQL 驱动程序可以通过 github.com/lib/pq
导入。
import _ "github.com/lib/pq"
5.2.3 SQLite 驱动程序
SQLite 驱动程序可以通过 github.com/mattn/go-sqlite3
导入。
import _ "github.com/mattn/go-sqlite3"
5.3 数据库连接与关闭
在与数据库交互之前,首先需要建立数据库连接,并在操作完成后关闭连接。
5.3.1 建立连接
使用 sql.Open
函数建立数据库连接:
db, err := sql.Open("mysql", "user:password@/dbname")
if err != nil {
log.Fatal(err)
}
defer db.Close()
5.3.2 测试连接
可以使用 db.Ping
方法测试连接是否成功:
err = db.Ping()
if err != nil {
log.Fatal(err)
}
5.4 执行基本的SQL操作(查询、插入、更新、删除)
通过 database/sql
包,可以执行基本的 SQL 操作,如查询、插入、更新和删除。
5.4.1 查询数据
使用 db.Query
方法执行查询操作:
rows, err := db.Query("SELECT id, name FROM users WHERE age > ?", 30)
if err != nil {
log.Fatal(err)
}
defer rows.Close()
for rows.Next() {
var id int
var name string
err = rows.Scan(&id, &name)
if err != nil {
log.Fatal(err)
}
fmt.Println(id, name)
}
err = rows.Err()
if err != nil {
log.Fatal(err)
}
5.4.2 插入数据
使用 db.Exec
方法插入数据:
result, err := db.Exec("INSERT INTO users (name, age) VALUES (?, ?)", "Alice", 25)
if err != nil {
log.Fatal(err)
}
lastInsertID, err := result.LastInsertId()
if err != nil {
log.Fatal(err)
}
fmt.Println("Last Insert ID:", lastInsertID)
5.4.3 更新数据
使用 db.Exec
方法更新数据:
result, err := db.Exec("UPDATE users SET age = ? WHERE name = ?", 26, "Alice")
if err != nil {
log.Fatal(err)
}
rowsAffected, err := result.RowsAffected()
if err != nil {
log.Fatal(err)
}
fmt.Println("Rows Affected:", rowsAffected)
5.4.4 删除数据
使用 db.Exec
方法删除数据:
result, err := db.Exec("DELETE FROM users WHERE name = ?", "Alice")
if err != nil {
log.Fatal(err)
}
rowsAffected, err := result.RowsAffected()
if err != nil {
log.Fatal(err)
}
fmt.Println("Rows Affected:", rowsAffected)
5.5 处理SQL错误
在处理数据库操作时,正确处理错误是非常重要的。
5.5.1 错误处理示例
每个数据库操作后,检查并处理可能的错误:
_, err := db.Exec("INVALID SQL STATEMENT")
if err != nil {
log.Printf("Error executing statement: %v", err)
}
5.5.2 常见的SQL错误
- sql.ErrNoRows:表示查询没有返回任何结果。
- sql.ErrConnDone:表示数据库连接已经关闭。
处理这些错误可以使用 errors.Is
方法:
if errors.Is(err, sql.ErrNoRows) {
log.Println("No rows were found")
} else {
log.Printf("Error executing query: %v", err)
}
通过学习和掌握这些数据库操作和错误处理方法,读者可以在 Go 语言中高效地与各种数据库进行交互。