我有给定查询的生成代码
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) 我正在使用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) 我正在开发一个简单的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
在我看来,这不是使用这些类型的最佳方式,这对我来说是违反直觉的。所以我的问题是,我做得对吗?有不同的方法吗?最终,有没有一种方法可以配置 …
我正在使用 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) 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
我正在从https://docs.sqlc.dev/en/latest/howto/query_count.html阅读 SQLC 文档。我想在我的项目中使用它。但是,我没有看到任何与表上的连接操作相关的文档。在 SQLC 中真的可能吗?如果是,我在哪里可以找到文档或参考资料?