go开发--操作mysql数据库

2023-12-20 20:38:32

在 Go 中访问 MySQL 数据库并进行读写操作通常需要使用第三方的 MySQL 驱动。Go 中常用的 MySQL 驱动有 github.com/go-sql-driver/mysqlgithub.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
}

文章来源:https://blog.csdn.net/liulanba/article/details/135114864
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。