sqlc.yaml 配置不会覆盖 postgresql 时间间隔到 time.Duration

2024年 2月 9日 30.4k 0

sqlc.yaml 配置不会覆盖 postgresql 时间间隔到 time.duration

php小编柚子在这里为大家介绍一个关于sqlc.yaml配置的问题。在使用postgresql时,我们经常需要使用时间间隔(time.Duration)来表示一段时间。然而,有时候我们会发现在sqlc.yaml配置文件中进行的时间间隔配置并不会生效,而是被默认的配置所覆盖。这个问题该如何解决呢?请继续阅读本文,我们将给出详细的解答。

问题内容

我发现 sqlc codegen 应用程序存在问题。万一,当我需要 interval (postgresql) 字段时,sqlc 会生成一个带有 int64 字段的对象。此解决方案看起来已损坏,并在扫描行时产生错误: errorf("cannot conversion %v to interval", value)

sqlc.yaml:

version: "2"
overrides:
go:
overrides:
- db_type: "interval"
engine: "postgresql"
go_type:
import: "time"
package: "time"
type: "https://pkg.go.dev/time#duration"
sql:
- queries: "./sql_queries/raffle.query.sql"
schema: "./migrations/001-init.sql"
engine: "postgresql"
gen:
go:
package: "raffle_repo"
out: "../repo/sql/raffle_repo"
sql_package: "pgx/v4"

登录后复制

schema.sql:

create table windowrange
(
id serial primary key,
open timestamp not null ,
duration interval not null,
created_at timestamp default now(),
updated_at timestamp default now(),
raffle_id integer not null
constraint raffle_id
references raffle
on delete cascade
);

登录后复制

生成的模型:

type Windowrange struct {
ID int32
Open time.Time
Duration int64
CreatedAt sql.NullTime
UpdatedAt sql.NullTime
RaffleID int32
}

登录后复制

通过将此字段设置为 time.duration 类型,问题很快就得到了修复。duration 和代码开始工作,但此代码是代码生成的,看起来是个错误的决定。

在尝试通过 sqlc.yaml 配置覆盖类型时,我什么都没有,对象仍在创建 int64 类型。我哪里错了,如何解决这个问题?

解决方法

在支持的类型,您将看到 pg_catalog.interval 也是 postgres 中 interval 支持的值之一。

因此,如果您只想使用 time.duration 而不是 int64,则需要将 overrides 部分更改为:

overrides:
go:
overrides:
- db_type: "pg_catalog.interval"
engine: "postgresql"
go_type:
import: "time"
type: "Duration"

登录后复制

提示:如果它不适用于最明显的数据类型,您可以尝试另一种。

以上就是sqlc.yaml 配置不会覆盖 postgresql 时间间隔到 time.Duration的详细内容,更多请关注每日运维网(www.mryunwei.com)其它相关文章!

相关文章

JavaScript2024新功能:Object.groupBy、正则表达式v标志
PHP trim 函数对多字节字符的使用和限制
新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
为React 19做准备:WordPress 6.6用户指南
如何删除WordPress中的所有评论

发布评论