文章目录
Go 语言使用 MySQL 的基础操作
在本文中,我们将介绍如何在Go语言中使用database/sql包以及相关的数据库驱动程序来进行数据库连接和操作。我们将使用MySQL数据库作为示例,展示使用go-sql-driver/mysql驱动进行基本的数据库操作。
1. 安装 MySQL 驱动
首先需要安装一个支持MySQL的Go语言驱动程序。本文档将以
go-sql-driver/mysql
为例:
在你的终端或命令提示符中运行以下命令:
go get -u github.com/go-sql-driver/mysql
2. 导入相关库
在你的 Go 代码中导入导入相关库:
import (
"database/sql"
"fmt"
_ "github.com/go-sql-driver/mysql"
)
引入数据库驱动时,需要使用
_
,表示仅导入本包的初始化函数 (init),而不主动调用包内的其他函数执行。
3. 数据库连接
创建一个连接 MySQL 数据库的函数:
func dbConnect() (*sql.DB, error) {
dsn := "username:password@tcp(localhost:3306)/dbname"
db, err := sql.Open("mysql", dsn)
return db, err
}
4. 创建表
创建一个用于示例的
users
表:
func createTable(db *sql.DB) error {
query :=
`CREATE TABLE IF NOT EXISTS users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50) NOT NULL,
age INT
)`
_, err := db.Exec(query)
return err
}
5. 插入数据
创建一个函数用于向
users
表中插入数据:
func insertUser(db *sql.DB, name string, age int) (int64, error) {
query := "INSERT INTO users (name, age) VALUES (?, ?)"
result, err := db.Exec(query, name, age)
if err != nil {
return 0, err
}
id, err := result.LastInsertId()
return id, err
}
6. 查询数据
创建一个函数用于从
users
表中查询数据:
type User struct {
ID int
Name string
Age int
}
func getUsers(db *sql.DB) ([]User, error) {
query := "SELECT id, name, age FROM users"
rows, err := db.Query(query)
if err != nil {
return nil, err
}
defer rows.Close()
var users []User
for rows.Next() {
var u User
err := rows.Scan(&u.ID, &u.Name, &u.Age)
if err != nil {
return nil, err
}
users = append(users, u)
}
return users, nil
}
7. 更新数据
创建一个函数用于更新
users
表中的数据:
func updateUser(db *sql.DB, id int, name string, age int) (int64, error) {
query := "UPDATE users SET name = ?, age = ? WHERE id = ?"
result, err := db.Exec(query, name, age, id)
if err != nil {
return 0, err
}
affectedRows, err := result.RowsAffected()
return affectedRows, err
}
8. 删除数据
创建一个函数用于从
users
表中删除数据:
func deleteUser(db *sql.DB, id int) (int64, error) {
query := "DELETE FROM users WHERE id = ?"
result, err := db.Exec(query, id)
if err != nil {
return 0, err
}
affectedRows, err := result.RowsAffected()
return affectedRows, err
}
9. 示例
这是一个完整的示例,替换 mysqlInfo 变量中的占位符,填入实际的用户名、密码、数据库名等内容。确保您已创建名为 Employees 的表。运行这个程序,它将会对 Employees 表进行插入、更新、查询和删除操作。
package main
import (
"database/sql"
"fmt"
_ "github.com/go-sql-driver/mysql"
)
func main() {
// 连接 MySQL 数据库
mysqlInfo := "username:password@tcp(localhost:3306)/yourDatabase?charset=utf8"
db, err := sql.Open("mysql", mysqlInfo)
if err != nil {
log.Fatal(err)
}
defer db.Close()
// 插入数据
insert := "INSERT INTO Employees(first_name, last_name, age) VALUES (?, ?, ?)"
result, err := db.Exec(insert, "Alice", "Smith", 30)
if err != nil {
fmt.Println("Error inserting data:", err)
} else {
fmt.Println("Data inserted successfully")
}
// 更新数据
update := "UPDATE Employees SET age = ? WHERE first_name = ? AND last_name = ?"
result, err = db.Exec(update, 31, "Alice", "Smith")
if err != nil {
fmt.Println("Error updating data:", err)
} else {
fmt.Println("Data updated successfully")
rowsAffected, _ := result.RowsAffected()
fmt.Println("Rows affected:", rowsAffected)
}
// 查询数据
query := "SELECT * FROM Employees"
rows, err := db.Query(query)
if err != nil {
fmt.Println("Error querying data:", err)
return
}
defer rows.Close()
fmt.Println("Fetching data from Employees table:")
var id, age int
var firstName, lastName string
for rows.Next() {
err := rows.Scan(&id, &firstName, &lastName, &age)
if err != nil {
fmt.Println("Error scanning data:", err)
} else {
fmt.Printf("ID: %d, Name: %s %s, Age: %d\n", id, firstName, lastName, age)
}
}
// 删除数据
delete := "DELETE FROM Employees WHERE first_name = ? AND last_name = ?"
result, err = db.Exec(delete, "Alice", "Smith")
if err != nil {
fmt.Println("Error deleting data:", err)
} else {
fmt.Println("Data deleted successfully")
rowsAffected, _ := result.RowsAffected()
fmt.Println("Rows affected:", rowsAffected)
}
}