首页 > 解决方案 > Golang SQLC 不生成结构

问题描述

我正在使用 sqlc 和 mysql,由于某种原因,生成的用于执行查询的代码在应该插入或查询数据库的对象的函数中没有结构或字段。

我的创建表查询与此类似

CREATE TABLE users (
    user_id int PRIMARY KEY,
    f_name varchar(255) NOT NULL,
    m_name varchar(255),
    l_name varchar(255) NOT NULL
);

查询看起来像这样

-- name: CreateUser :exec
INSERT INTO users (f_name,
                   m_name,
                   l_name)
VALUES ($1, $2, $3);

-- name: GetUserByUserId :one
SELECT * FROM users
WHERE user_id = $1;

这是生成的

const createUser = `-- name: CreateUser :exec
INSERT INTO users (
                   f_name,
                   m_name,
                   l_name)
VALUES ($1, $2, $3)
`

func (q *Queries) CreateUser(ctx context.Context) error {
    _, err := q.db.ExecContext(ctx, createUser)
    return err
}

const getUserByUserId = `-- name: GetUserByUserId :one
SELECT f_name, m_name, l_name FROM users
WHERE user_id = $1
`

func (q *Queries) GetUserByUserId(ctx context.Context) (User, error) {
    row := q.db.QueryRowContext(ctx, getUserByUserId)
    var i User
    err := row.Scan(
        &i.UserID,
        &i.FName,
        &i.MName,
        &i.LName
    )
    return i, err
}

正如您在生成的代码中看到的那样,createUser没有生成可以反过来将函数参数传递给的结构CreateUser,对于getUserByUserId没有在函数中传递的 userId 参数也是如此GetUserByUserId

不确定做错了什么,这是我的sqlc.yaml文件的样子

version: "1"
packages:
  - name: "db"
    path: "./db/sqlc"
    queries: "./db/query/"
    schema: "./db/migration/"
    engine: "mysql"
    emit_json_tags: true
    emit_prepared_queries: false
    emit_interface: false
    emit_exact_table_names: false

标签: mysqlgosqlc

解决方案


所以我在 sqlc GitHub repo 上的问题做了一些挖掘,并在这里找到了解决方案

我的错误是我$在声明 mysql 无法识别的查询参数时使用。我?改用它并且它有效

我的查询现在看起来像这样

-- name: CreateUser :exec
INSERT INTO users (f_name,
                   m_name,
                   l_name)
VALUES (?, ?, ?);

-- name: GetUserByUserId :one
SELECT * FROM users
WHERE user_id = ?;

推荐阅读