在 Go 中访问 MySQL 数据库并进行读写操作通常需要使用第三方的 MySQL 驱动。Go 中常用的 MySQL 驱动有 github.com/go-sql-driver/mysql
和 github.com/go-xorm/xorm
等。
一,通过执行sql语句来和数据库交互
安装 MySQL 驱动:
在终端中执行以下命令,安装 github.com/go-sql-driver/mysql:
go get -u github.com/go-sql-driver/mysql
下面是一个简单的 Go 程序,演示如何连接 MySQL 数据库,并进行读写操作。
package main
import (
"database/sql"
"fmt"
"log"
_ "github.com/go-sql-driver/mysql"
)
const (
dbHost = "localhost"
dbPort = 3306
dbUser = "your_username"
dbPassword = "your_password"
dbName = "your_database"
)
func main() {
// 构建数据库连接字符串
dataSourceName := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s", dbUser, dbPassword, dbHost, dbPort, dbName)
// 连接数据库
db, err := sql.Open("mysql", dataSourceName)
if err != nil {
log.Fatal(err)
}
defer db.Close()
// 测试数据库连接
if err := db.Ping(); err != nil {
log.Fatal(err)
}
fmt.Println("Connected to MySQL database!")
// 创建表
createTable(db)
// 插入数据
insertData(db)
// 查询数据
queryData(db)
}
// 创建表
func createTable(db *sql.DB) {
createTableSQL := `
CREATE TABLE IF NOT EXISTS users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50),
email VARCHAR(50)
);`
_, err := db.Exec(createTableSQL)
if err != nil {
log.Fatal(err)
}
fmt.Println("Table 'users' created successfully.")
}
// 插入数据
func insertData(db *sql.DB) {
insertDataSQL := "INSERT INTO users (username, email) VALUES (?, ?);"
_, err := db.Exec(insertDataSQL, "john_doe", "john@example.com")
if err != nil {
log.Fatal(err)
}
fmt.Println("Data inserted successfully.")
}
// 查询数据
func queryData(db *sql.DB) {
queryDataSQL := "SELECT id, username, email FROM users;"
rows, err := db.Query(queryDataSQL)
if err != nil {
log.Fatal(err)
}
defer rows.Close()
for rows.Next() {
var id int
var username, email string
if err := rows.Scan(&id, &username, &email); err != nil {
log.Fatal(err)
}
fmt.Printf("ID: %d, Username: %s, Email: %s\n", id, username, email)
}
if err := rows.Err(); err != nil {
log.Fatal(err)
}
}
在上面的代码中,需要将 your_username、your_password、your_database 替换为你的 MySQL 数据库的用户名、密码和数据库名。
二,通过ORM方式操作数据库
在实际项目中,通常会采用结构体和 ORM(对象关系映射)库,以便更方便地进行数据库操作。下面是一个使用 github.com/go-xorm/xorm 的示例,该库是一个功能强大的 ORM 库,支持多种数据库
安装 xorm:
在终端中执行以下命令,安装 github.com/go-xorm/xorm:
go get -u github.com/go-xorm/xorm
安装数据库驱动:
在终端中执行以下命令,安装 MySQL 驱动:
go get -u github.com/go-sql-driver/mysql
下面是一个使用 xorm 的示例,实现用户注册、登录和查询功能:
package main
import (
"fmt"
"log"
"os"
"github.com/go-xorm/xorm"
_ "github.com/go-sql-driver/mysql"
)
const (
dbHost = "localhost"
dbPort = 3306
dbUser = "your_username"
dbPassword = "your_password"
dbName = "your_database"
)
// User 结构体对应数据库中的 users 表
type User struct {
Id int64 `xorm:"pk autoincr"`
Username string `xorm:"unique"`
Password string
Email string
}
var engine *xorm.Engine
func main() {
initDB()
// 注册用户
user := User{
Username: "john_doe",
Password: "password123",
Email: "john@example.com",
}
err := registerUser(&user)
if err != nil {
log.Fatal(err)
}
fmt.Println("User registered successfully!")
// 登录
loggedInUser, err := loginUser("john_doe", "password123")
if err != nil {
log.Fatal(err)
}
fmt.Printf("Logged in user: %+v\n", loggedInUser)
// 查询所有用户
allUsers, err := getAllUsers()
if err != nil {
log.Fatal(err)
}
fmt.Println("All users:")
for _, u := range allUsers {
fmt.Printf("%+v\n", u)
}
}
func initDB() {
var err error
dataSourceName := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8mb4", dbUser, dbPassword, dbHost, dbPort, dbName)
engine, err = xorm.NewEngine("mysql", dataSourceName)
if err != nil {
log.Fatal(err)
}
// 显示 SQL 语句
engine.ShowSQL(true)
// 同步表结构
if err := engine.Sync2(new(User)); err != nil {
log.Fatal(err)
}
}
func registerUser(user *User) error {
_, err := engine.Insert(user)
return err
}
func loginUser(username, password string) (*User, error) {
user := &User{Username: username, Password: password}
has, err := engine.Get(user)
if err != nil {
return nil, err
}
if !has {
return nil, fmt.Errorf("user not found")
}
return user, nil
}
func getAllUsers() ([]User, error) {
var users []User
err := engine.Find(&users)
return users, err
}