Golang Go语言中关于sqlc的问题:当我修改query之后造成go结构体字段的变化,如何自定义?

表 1 有两个字段挪到 表 2 上了. 之前的 query.sql 是这样的:

select * from t1

sqlc 生成的结构体是这样的:

type Haha struct {
	...
	Username       string `json:"username"`
	Password       string `json:"password"`
    ...
}

现在的 query.sql 长这样:

select t1.*, t2.*
from t1
left join t2
on t1.id=t2.pid

生成的结构体变这样了:

type Haha struct {
	Username       sql.NullString `json:"username"`
	Password       sql.NullString `json:"password"`
}

sql.NullString 这是个结构体, 导致我所有的业务代码都要改. 请问有没有什么办法能让他变回 string?

t2 join t1 这种方法不行. 因为我还有一些其他字段依赖 t1 相当于没解决问题.

sqlc 是否有针对这种情况进行考虑? config 中的 rename 感觉是全局修改, 自定义性不强.

第二个问题是各位大佬在使用 sqlc 的过程中, 针对表结构和 query.sql 的修改是如何设计的?

谢谢


Golang Go语言中关于sqlc的问题:当我修改query之后造成go结构体字段的变化,如何自定义?

更多关于Golang Go语言中关于sqlc的问题:当我修改query之后造成go结构体字段的变化,如何自定义?的实战教程也可以访问 https://www.itying.com/category-94-b0.html

2 回复

临时是这样解决的. 但是总感觉怪怪的.
sql<br>select t1.*, t2.*,<br>t2.username::varchar(255) AS username,<br>t2."password"::varchar(255) AS "password",<br>from t1<br>left join t2<br>on <a target="_blank" href="http://t1.id" rel="nofollow noopener">t1.id</a>=t2.pid<br><br>

更多关于Golang Go语言中关于sqlc的问题:当我修改query之后造成go结构体字段的变化,如何自定义?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


在Golang中使用sqlc时,如果你修改了SQL查询并希望自定义生成的结构体字段,可以通过在SQL注释中使用@name@type指令来实现。这些指令允许你控制sqlc生成的代码,使其更符合你的需求。

  1. 使用@name指令:当你想为生成的结构体字段指定一个自定义名称时,可以在SQL查询中使用@name指令。例如,如果你的查询返回一个名为user_id的列,但你希望在Go中使用UserID作为字段名,可以这样做:
-- name: GetUser :one
SELECT id AS user_id, name 
FROM users 
WHERE id = $1;

然后在生成的代码中,你会看到UserID而不是UserIduser_id

  1. 使用@type指令:如果你需要指定一个自定义的类型,可以使用@type指令。这在处理枚举或特殊类型时特别有用。例如:
-- name: GetStatus :one
-- type: StatusType
SELECT status_code, status_description 
FROM statuses 
WHERE id = $1;

然后,在你的Go代码中,你需要定义StatusType结构体:

type StatusType struct {
    StatusCode        int
    StatusDescription string
}

通过这些指令,你可以精确地控制sqlc为你生成的结构体,确保它们与你的Go代码风格和业务逻辑保持一致。在修改查询后,记得重新运行sqlc以生成最新的代码。

回到顶部