标签: sqlc

如何在sqlc golang中将文本类型从pgtype.Text更改为字符串?

我有给定查询的生成代码

INSERT INTO "users" (
    username,
    name,
    surname,
    email,
    hashed_password,
    role
) VALUES (
    $1, $2, $3, $4, $5, $6
) RETURNING "id", "username";
Run Code Online (Sandbox Code Playgroud)

看起来像这样

type CreateUserParams struct {
    Username       string      `json:"username"`
    Name           pgtype.Text `json:"name"`
    Surname        pgtype.Text `json:"surname"`
    Email          string      `json:"email"`
    HashedPassword string      `json:"hashed_password"`
    Role           UserRole    `json:"role"`
}
Run Code Online (Sandbox Code Playgroud)

我怎样才能变成Name pgtype.Textgolang字符串?目前我的sqlc.yaml文件如下所示

INSERT INTO "users" (
    username,
    name,
    surname,
    email,
    hashed_password,
    role
) VALUES (
    $1, $2, $3, $4, $5, $6
) RETURNING "id", "username";
Run Code Online (Sandbox Code Playgroud)

我的架构如下所示

type CreateUserParams …
Run Code Online (Sandbox Code Playgroud)

go sqlc

8
推荐指数
1
解决办法
1229
查看次数

sqlc + pgx:用户定义枚举数组:无法扫描文本格式的未知类型(OID 16385)

我正在使用sqlcand pgx/v5,并且对于用户定义的枚举类型的 postgres 数组出现以下错误:

Error: can't scan into dest[1]: cannot scan unknown type (OID 16385) in text format into *pgtype.Array[my-app/sqlc.Option]

架构和查询:

CREATE TYPE option AS ENUM (
    'OPT_1',
    'OPT_2',
    'OPT_3'
);

CREATE TABLE IF NOT EXISTS blah (
    id BIGINT PRIMARY KEY,
    options option[] NOT NULL DEFAULT '{OPT_1}'
);

-- name: CreateBlah :one
INSERT INTO blah (
    id
) VALUES (
    $1
)
RETURNING *;
Run Code Online (Sandbox Code Playgroud)

sqlc似乎正确生成了类型:

CREATE TYPE option AS ENUM (
    'OPT_1',
    'OPT_2',
    'OPT_3'
); …
Run Code Online (Sandbox Code Playgroud)

arrays enums go pgx sqlc

6
推荐指数
1
解决办法
1333
查看次数

Go - 使用 pgtypes 的正确方法

我正在开发一个简单的Go服务来连接到数据库以进行基本查询。我用来sqlc生成Go与数据库交互的函数。lib/pq当从现在切换驱动程序时,pgx/v5数据库字段的类型而pgtypes不是Go类型。这是一个例子:

而不是这个:

    type ListAccountsParams struct {
        Owner  string `json:"owner"`
        Limit  int32  `json:"limit"`
        Offset int32  `json:"offset"`
    }
Run Code Online (Sandbox Code Playgroud)

我现在明白了:

    type ListAccountsParams struct {
        Owner  pgtype.Text `json:"owner"`
        Limit  pgtype.Int4 `json:"limit"`
        Offset pgtype.Int4 `json:"offset"`
    }
Run Code Online (Sandbox Code Playgroud)

然而我发现使用的唯一方法pgtypes是这个:

    owner := pgtype.Text{
        String: "Craigs List",
        Valid: true,
    }
Run Code Online (Sandbox Code Playgroud)

而不是仅仅做owner := "Craigs List"。对于数字类型就更矫枉过正了,我找到的所有实现都是这样的:

    pgtype.Numeric{
    Int: big.NewInt(-543), 
    Exp: 3, 
    Status: pgtype.Present
    }
Run Code Online (Sandbox Code Playgroud)

使用sqlc配置文件,我可以覆盖这些类型以支持标准类型,但对我来说必须覆盖 postgres类型等等Go是没有意义的......textstring

在我看来,这不是使用这些类型的最佳方式,这对我来说是违反直觉的。所以我的问题是,我做得对吗?有不同的方法吗?最终,有没有一种方法可以配置 …

go libpq pgx sqlc

6
推荐指数
1
解决办法
862
查看次数

Golang Gin 验证和 SQLC

我正在使用 SQLC 根据我的架构和 Gin 生成 Web API 的结构。

在这里查看此主题:Golang how to use Validator with SqlC后,我注意到答案特别指出:

我无法更改 Param 结构,但我猜想使用表主结构来进行验证。

这正是我所追求的行为。我注意到,如果我有一个使用给定表的子集的查询,例如:

-- name: CreateUserBasic :one
INSERT INTO users (
    username, email, phone
) VALUES (
    $1, $2, $3
) RETURNING *;
Run Code Online (Sandbox Code Playgroud)

它产生如下结构:

type CreateUserBasicParams struct {
    Username string      `json:"username"`
    Email    string      `json:"email"`
    Phone    pgtype.Text `json:"phone"`
}
Run Code Online (Sandbox Code Playgroud)

就我而言,我什至包含了用于添加“required”标签的覆盖:

version: 2
sql:
  - engine: "postgresql"
    schema: [
      ...
    ]
    queries: [
      ...
    ]
    strict_function_checks: true
    gen:
      go:
        emit_json_tags: true
        sql_package: "pgx/v5"
        package: …
Run Code Online (Sandbox Code Playgroud)

validation json go sqlc

5
推荐指数
1
解决办法
358
查看次数

有没有办法让sqlc生成可以使用pgxpool的代码

sqlc我最近开始使用jackc/pgx/v5. 我也希望能够使用,但是在流程接管后pgxpool确实没有什么好的方法可以使用。例如,这就是我初始化连接池的方式:pgxpoolsqlc

var err error
var pool *pgxpool.Pool
if pool, err = pgxpool.New(context.Background(), url); err != nil {
    log.Panicf(...)
}
defer pool.Close()

queries := db.New(pool) // queries *Queries
Run Code Online (Sandbox Code Playgroud)

基本上,queries每当需要数据库交互时,我只是将其提供给整个应用程序,但我不会传递pool.

此外,由于sqlc自动管理连接,我不确定使用类似以下代码片段的含义,因为涉及很多手动步骤并且有些重叠:

ctx := context.Background()

conn, _ := pool.Acquire(ctx)
tx, _ := conn.Begin(ctx)
defer tx.Rollback(ctx)

queries := db.New(pool)
queries.WithTx(tx).OneOfTheAutogeneratedQueries(ctx)

defer conn.Release()
tx.Commit(ctx)
Run Code Online (Sandbox Code Playgroud)

有人有同样的情况吗?有更好的方法来解决这个问题吗?我假设自动生成的代码将提供一种相应的管理事务的机制,但看起来除了以编程方式关闭资源之外,sqlc仍然需要池的引用才能创建类型。pgx.Tx

go pgx sqlc

3
推荐指数
1
解决办法
1195
查看次数

Go的sqlc支持join吗?

我正在从https://docs.sqlc.dev/en/latest/howto/query_count.html阅读 SQLC 文档。我想在我的项目中使用它。但是,我没有看到任何与表上的连接操作相关的文档。在 SQLC 中真的可能吗?如果是,我在哪里可以找到文档或参考资料?

go sqlc

2
推荐指数
1
解决办法
2612
查看次数

标签 统计

go ×6

sqlc ×6

pgx ×3

arrays ×1

enums ×1

json ×1

libpq ×1

validation ×1