• 使用 sqlc 生成类型安全的Go代码与SQL数据库交互


    什么是sqlc

    sqlc 官方文档

    sqlc 是一个用于生成类型安全的 Go 代码的工具,用于与 SQL 数据库进行交互。它通过分析 SQL 查询语句来生成 Go 代码,该代码映射数据库表和列,并提供类型安全的方法来执行查询、插入、更新和删除等操作。

    sqlc 支持多种 SQL 数据库,包括 PostgreSQL、MySQL、SQLite、Microsoft SQL Server 等。它通过配置文件定义数据库模式,并生成 Go 代码以便与数据库进行交互。这使得在 Go 项目中使用 SQL 数据库变得更加容易和类型安全。

    安装sqlc:brew install sqlc

    在 macOS 上,可以使用 Homebrew 进行安装,只需运行以下命令:

    brew install sqlc
    
    • 1

    安装完成后,可以验证是否成功安装 sqlc,运行以下命令检查版本信息:

    sqlc version
    
    • 1

    查看命令帮助

    sqlc help
    
    • 1

    使用sqlc

    1. 创建SQL文件

    首先,在你的项目中创建 SQL 文件,以定义数据库表结构和 SQL 查询语句。例如,你可以创建一个 create.sql 文件,用于定义数据库表结构,并创建一个 query.sql 文件,用于包含查询语句。在这些 SQL 文件中,你可以定义数据库表、列以及各种 SQL 查询,如创建、查询、更新和删除等。

    /sql/create.sql

    # 数据库初始化
    -- 创建库
    create database if not exists dbnamexxx;
    
    -- 切换库
    use dbnamexxx;
    
    -- 用户表
    create table if not exists user
    (
        id           bigint auto_increment comment 'id' primary key,
        userAccount  varchar(256)                           not null comment '账号',
        userPassword varchar(512)                           not null comment '密码',
        userRole     varchar(256) default 'user'            not null comment '用户角色:user / admin',
        userName     varchar(256)                           null comment '用户昵称',
        userAvatar   varchar(1024)                          null comment '用户头像',
        gender       tinyint                                null comment '性别',
        createTime   datetime     default CURRENT_TIMESTAMP not null comment '创建时间',
        updateTime   datetime     default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment '更新时间',
        isDelete     tinyint      default 0                 not null comment '是否删除',
        constraint uni_userAccount UNIQUE (userAccount),
    ) comment '用户';
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    /sql/query.sql

    -- name: GetUserInfoById :one
    SELECT * FROM `user`
    WHERE `id` = ? AND `isDelete` = 0 LIMIT 1;
    
    -- name: ListUsers :many
    SELECT * FROM `user`
    WHERE `isDelete` = 0
    ORDER BY id
    LIMIT ?
    OFFSET ?;
    
    -- name: CreateUser :execresult
    insert into `user` (
        `userAccount`, `userPassword`
        ) values (
            ?, ?
        );
    
    -- name: DeleteUser :exec
    UPDATE `user` set `isDelete` = 1 
    WHERE id = ?;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    2. 编写sqlc配置文件:sqlc.yaml

    创建一个名为 sqlc.yaml 的配置文件,用于指定 sqlc 如何生成 Go 代码。在配置文件中,你需要指定 SQL 文件的位置、生成的包名、生成代码的输出目录以及其他选项。这个配置文件告诉 sqlc 如何处理你的 SQL 查询和数据库模式。

    /sqlc.yaml

    version: 2
    sql:
      - engine: "mysql"
        # 包含数据库迁移文件的目录[迁移文件存放目录]
        schema: "./sql/create"
        # 指定在哪里查找 SQL 查询语句[sql查询语句存放路径]
        queries: "./sql/query"
        gen:
          go:
            #生成文件目录
            package: "dbsq"
            out: "dbsq"
            emit_prepared_queries: true
            emit_empty_slices: false
            emit_exported_queries: false
            emit_methods_with_db_argument: false
            emit_pointers_for_null_types: true
            emit_enum_valid_method: false
            emit_all_enum_values: false
            emit_interface: false
            # 如果为true,则结构名称将镜像表名称。否则,sqlc会尝试将多个表名单独化。默认为false。
            emit_exact_table_names: false
            # 如果为true,请将JSON标记添加到生成的结构中。默认为false
            emit_json_tags: true
            # 如果为true,则查询结果将作为指向结构的指针返回。返回多个结果的查询将作为指针切片返回。默认为false。
            emit_result_struct_pointers: true
            # 如果为true,则参数将作为指向结构的指针传递。默认为false。
            emit_params_struct_pointers: true
            # 如果为true,json标记中的“Id”将为大写。如果为false,则为camelcase。默认为false
            json_tags_id_uppercase: true
            # camelCase使用camel,pascal使用PascalCase,snake使用snake_case或none使用DB中的列名。默认为无。
            json_tags_case_style: "snake"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    3. 生成代码:sqlc generate

    在终端中,进入项目根目录,并执行以下命令,使用 sqlc 生成 Go 代码:

    sqlc generate
    
    • 1

    sqlc 将分析 SQL 文件并生成相应的 Go 代码,包括类型定义、查询函数等。

    4. 使用生成的代码

    现在,你可以在你的 Go 项目中使用生成的代码。这些代码包括了与数据库交互的类型安全函数,使你能够执行查询、插入、更新和删除等操作。你可以直接调用这些函数,并将其与你的数据库连接一起使用。

    package main
    
    import (
        "context"
        "database/sql"
        "log"
    
        _ "github.com/go-sql-driver/mysql"
        "github.com/your-username/your-project/queries" // 替换成你的项目路径
    )
    
    func main() {
        // 连接数据库
        db, err := sql.Open("mysql", "user:password@tcp(host:port)/database")
        if err != nil {
            log.Fatal(err)
        }
        defer db.Close()
    
        // 查询用户信息
        var id int64 = 1
        user, err := q.GetUserInfoById(context.Background(), id)
        if err != nil {
            if err == sql.ErrNoRows {
                log.Println("User not found")
            } else {
                log.Fatal(err)
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
  • 相关阅读:
    Git常用命令及IDEA集成Git
    蔚来-软件开发工程师一面记录
    Java操作Excel
    nodejs 的下载安装与环境配置
    CPS攻击案例(一)——基于脉冲宽度调制PWM的无人机攻击
    Python 编程竟然如此幽默!揭秘程序员们的搞笑日常,快来看看吧!
    idea所有历史版本下载
    轻松入门自然语言处理系列 专题8 源码解读──基于HMM的结巴分词
    C/C++输出绝对值 2019年9月电子学会青少年软件编程(C/C++)等级考试一级真题答案解析
    Pinterest:从 Druid 到 StarRocks,实现 6 倍成本效益比提升
  • 原文地址:https://blog.csdn.net/trinityleo5/article/details/132112084