MySQL 数据库操作

概述

数据库的相关使用, 我们一般推荐使用 goctl 直接生成 model 代码,同时会自动生成 golang 结构体,CURD操作方法,缓存等,可以参考 goctl model

但是针对特殊情况需要自行直接链接数据库的,我们也可以直接自己初始化 sql conn。

任务目标

  1. 了解 github.com/zeromicro/go-zero/core/stores/sqlx 包的使用。
  2. 根据 sqlx 创建一个 sql 链接。

创建数据库

首先在的数据库中创建如下的表。

  1. CREATE TABLE user (
  2. id bigint AUTO_INCREMENT,
  3. name varchar(255) NOT NULL DEFAULT '' COMMENT 'The username',
  4. type tinyint(1) NULL DEFAULT 0 COMMENT 'The user type, 0:normal,1:vip, for test golang keyword',
  5. create_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  6. update_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  7. PRIMARY KEY (id)
  8. ) ENGINE = InnoDB COLLATE utf8mb4_general_ci COMMENT 'user table';

连接到数据库

  1. Mysql

    1. package main
    2. import (
    3. "github.com/zeromicro/go-zero/core/stores/sqlx"
    4. )
    5. func main() {
    6. // 参考 https://github.com/go-sql-driver/mysql#dsn-data-source-name 获取详情
    7. // 需要自行将 dsn 中的 host,账号 密码配置正确
    8. dsn := "user:pass@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"
    9. conn := sqlx.NewMysql(dsn)
    10. _ = conn
    11. }
    MySQL 数据库操作 - 图1注意

    想要正确的处理 time.Time ,您需要带上 parseTime 参数, 更多参数 要支持完整的 UTF-8 编码,您需要将 charset=utf8 更改为 charset=utf8mb4

  2. 自定义驱动

    go-zero 允许通过 DriverName 选项自定义 MySQL 驱动,例如:

    1. package main
    2. import (
    3. "github.com/zeromicro/go-zero/core/stores/sqlx"
    4. )
    5. func main() {
    6. dsn := "user:pass@tcp(127.0.0.1:3307)/dbname?charset=utf8mb4&parseTime=True&loc=Local"
    7. conn := sqlx.NewSqlConn("mysql", dsn)
    8. _ = conn
    9. }
  3. 现有的数据库连接

go-zero 允许通过 现有的数据库初始化 Sql 链接,例如:

  1. package main
  2. import (
  3. "database/sql"
  4. "github.com/zeromicro/go-zero/core/stores/sqlx"
  5. )
  6. func main() {
  7. sqlDB, err := sql.Open("mysql", "mydb_dsn")
  8. if err != nil {
  9. panic(err)
  10. }
  11. conn := sqlx.NewSqlConnFromDB(sqlDB)
  12. _ = conn
  13. }

开始 CRUD

  1. 插入一条数据

    我们使用上面的创建链接的方法得到一个链接之后,我们可以开始操作数据库。

  1. package main
  2. import (
  3. "context"
  4. "fmt"
  5. "github.com/zeromicro/go-zero/core/stores/sqlx"
  6. )
  7. func main() {
  8. // 参考 https://github.com/go-sql-driver/mysql#dsn-data-source-name 获取详情
  9. // 需要自行确保 dsn 中的 host 账号 密码都配置正确
  10. dsn := "user:pass@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"
  11. conn := sqlx.NewMysql(dsn)
  12. r, err := conn.ExecCtx(context.Background(), "insert into user (type, name) values (?, ?)", 1, "test")
  13. if err != nil {
  14. panic(err)
  15. }
  16. fmt.Println(r.RowsAffected())
  17. }

执行程序,我们会在user 中插入一条记录。

  1. 查询数据

    我们需要先定义一个 User 结构体,接着再查询

    1. package main
    2. import (
    3. "context"
    4. "database/sql"
    5. "time"
    6. "github.com/zeromicro/go-zero/core/stores/sqlx"
    7. )
    8. type User struct {
    9. Id int64 `db:"id"`
    10. Name sql.NullString `db:"name"` // The username
    11. Type int64 `db:"type"` // The user type, 0:normal,1:vip, for test golang keyword
    12. CreateAt sql.NullTime `db:"create_at"`
    13. UpdateAt time.Time `db:"update_at"`
    14. }
    15. func main() {
    16. // 参考 https://github.com/go-sql-driver/mysql#dsn-data-source-name 获取详情
    17. // 需要自行确保 dsn 中的 host 账号 密码都配置正确
    18. dsn := "user:pass@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"
    19. conn := sqlx.NewMysql(dsn)
    20. var u User
    21. query := "select id, name, type, create_at, update_at from user where id=?"
    22. err := conn.QueryRowCtx(context.Background(), &u, query, 1)
    23. if err != nil {
    24. panic(err)
    25. }
    26. }

    执行上述程序,我们会看到 我们刚刚插入进去的 user 信息

  2. 修改数据 我们继续修改代码

    1. package main
    2. import (
    3. "context"
    4. "fmt"
    5. "github.com/zeromicro/go-zero/core/stores/sqlx"
    6. )
    7. func main() {
    8. // 参考 https://github.com/go-sql-driver/mysql#dsn-data-source-name 获取详情
    9. // 需要自行确保 dsn 中的 host 账号 密码都配置正确
    10. dsn := "user:pass@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"
    11. conn := sqlx.NewMysql(dsn)
    12. _, err := conn.ExecCtx(context.Background(), "update user set type = ? where name = ?", 2, "test")
    13. if err != nil {
    14. fmt.Println(err)
    15. return
    16. }
    17. }

    运行上述代码,会发现数据库中的记录 type 变为 2了。

  3. 删除数据

    1. package main
    2. import (
    3. "context"
    4. "fmt"
    5. "github.com/zeromicro/go-zero/core/stores/sqlx"
    6. )
    7. func main() {
    8. // 参考 https://github.com/go-sql-driver/mysql#dsn-data-source-name 获取详情
    9. // 需要自行确保 dsn 中的 host 账号 密码都配置正确
    10. dsn := "user:pass@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"
    11. conn := sqlx.NewMysql(dsn)
    12. _, err := conn.ExecCtx(context.Background(), "delete from user where `id` = ?", 1)
    13. if err != nil {
    14. fmt.Println(err)
    15. return
    16. }
    17. }

运行上述代码,会发现数据库中的记录已经被删除了。

至此,你已经完成 mysql 数据库的基本使用。

参考文献