如何在Golang sqlc中将pgtype.Text转为string(含可为空字段)
问题
我用sqlc生成SQL查询对应的Go代码,SQL语句如下:
INSERT INTO "users" ( username, name, surname, email, hashed_password, role ) VALUES ( $1, $2, $3, $4, $5, $6 ) RETURNING "id", "username";
生成的结构体为:
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"` }
users表的name和surname字段允许为NULL,表结构如下:
CREATE TABLE users ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), username VARCHAR(50) UNIQUE NOT NULL, name VARCHAR(100), surname VARCHAR(100), email VARCHAR(150) UNIQUE NOT NULL CHECK (email ~* '^[A-Za-z0-9._%-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}$'), hashed_password VARCHAR(1024) NOT NULL, role user_role NOT NULL DEFAULT 'USER', created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW() );
sqlc生成了pgtype.Text类型,但我希望把这两个字段改成Go原生的string类型。当前我的sqlc.yaml配置如下:
version: "2" sql: - schema: "db/migrations/users" queries: "db/queries" engine: "postgresql" gen: go: package: "internal" out: "db/internal/" sql_package: "pgx/v5" output_files_suffix: "_gen" emit_json_tags: true emit_interface: true emit_empty_slices: true overrides: - db_type: "timestamptz" go_type: "time.Time" - db_type: "uuid" go_type: "github.com/google/uuid.UUID" - db_type: "text" go_type: type: "string"
请问怎么把这两个字段转为string类型?
解决方案
你当前的配置只覆盖了text类型,但name和surname是VARCHAR(100)类型,需要针对varchar类型添加覆盖规则,才能让sqlc将可空的varchar字段映射为Go原生string。
修改sqlc.yaml中的overrides部分,添加varchar类型的覆盖规则:
overrides: - db_type: "timestamptz" go_type: "time.Time" - db_type: "uuid" go_type: "github.com/google/uuid.UUID" - db_type: "text" go_type: type: "string" # 添加通用varchar类型的覆盖 - db_type: "varchar" go_type: type: "string" nullable: true # 也可以精确匹配指定长度的varchar,比如对应表中的varchar(100) - db_type: "varchar(100)" go_type: type: "string" nullable: true
其中nullable: true用于明确告诉sqlc该数据库字段允许为NULL,生成Go代码时会自动处理空字符串与数据库NULL值的映射。
修改完成后,重新运行sqlc生成代码,CreateUserParams中的Name和Surname字段就会变为string类型。
内容的提问来源于stack exchange,提问作者Mayukh Sarkar
相关产品推荐
相关产品推荐

