goctl是go-zero的内置脚手架,可以一键生成代码、文档、部署k8s yaml、dockerfile等。它可以一键快速生成api、rpc,也能根据sql脚本生成mysql、mongodb和postgreSQL的go代码。
但在实际操作过程中,go-zero官网对于postgreSQL的描述和例子过少,导致我在用goctl生成model的过程中走了不少弯路。希望可以在此将我遇到的问题共享出来,能够切实帮助到大家。
首先是官网地址go-zero 缩短从需求到上线的距离,下图为官网主页。
此刻,2024年3月15日,我用的环境版本如下:
- go version go1.19.4 windows/amd64
- goctl version 1.5.4 windows/amd64
- libprotoc 3.19.4
- gozero v1.6.3
- postgreSQl是阿里云上的polarDB postgreSQL 14.9.13.0 – 稳定版
关于goctl操作postgreSQL代码生成,官网只在下图做了一些描述,没有例子。
从图中可以看出,对于postgreSQL的支持,只有使用goctl model pg datasource这一条指令。如何生成相应代码,需要配置好各项参数。
这些参数最重要的就是table和url两项,如下图所示:
其中table是要根据sql文件生成的表名,url是数据库连接必须的相关信息。这两个参数都是必填,其它参数可选。以下SQL脚本是我的tbl_user表。
CREATE TABLE IF NOT EXISTS tbl_user
(
create_time timestamp(0) without time zone NOT NULL,
update_time timestamp(0) without time zone NOT NULL,
delete_time timestamp(0) without time zone NOT NULL,
id bigint NOT NULL GENERATED ALWAYS AS IDENTITY,
uuid character varying(191) COLLATE pg_catalog."default" NOT NULL DEFAULT ''::character varying,
mobile text COLLATE pg_catalog."default" DEFAULT ''::bpchar,
email character varying(255) COLLATE pg_catalog."default" DEFAULT ''::character varying,
password character varying(255) COLLATE pg_catalog."default" DEFAULT ''::character varying,
nickname character varying(255) COLLATE pg_catalog."default" DEFAULT ''::character varying,
sex bigint DEFAULT 0,
avatar character varying(255) COLLATE pg_catalog."default" DEFAULT ''::character varying,
info character varying(255) COLLATE pg_catalog."default" DEFAULT ''::character varying,
del_state bigint DEFAULT 0,
version bigint DEFAULT 0,
CONSTRAINT tbl_user_pkey PRIMARY KEY (id),
CONSTRAINT idx_nick UNIQUE (nickname)
)
我的postgreSQL数据库是连接阿里云的polarDB postgreSQL,使用如下命令:
goctl model pg datasource --cache true --schema "public" --dir ".\model\" --url "postgres://username:#password#@阿里云数据库公网ip:阿里云数据库公网端口号/dbtest?sslmode=disable" --table "tbl_user"
备注:#password#整体作为密码。这样写是为了说明以下的问题。
结果报错,信息如下
failed to connect to `host=username user=MyComputer database=`: hostname resolving error (lookup username: no such host)
真是奇怪,我这里卡住了很久。明明各项信息输入正确,但就是一直报这个错误,model代码也生成不了。最后,我改了一下密码,就解决了。正常结果就是显示
Done.
工程里面也会生成相应代码:
通过分析,这里有一个坑。就是密码不可以有#字符。我是将两个#字符换成了@和=才正常通过。
另外,命令行工具中使用goctl model pg datasource –help查询帮助信息,如下所示:
它对于url的描述,和官网上差了一个前缀postgres://,这里就会产生误导,如果不加前缀,结果就是下面的错误信息:
failed to connect to `host=localhost user=MyComputer database=`: dial error (dial tcp [::1]:5432: connectex: No connection could be made because the target machine actively refused it.)
所以这个前缀postgres://是一定要加的。
最后再给出正确的指令:
goctl model pg datasource --cache true --schema "public" --dir ".\model\" --url "postgres://username:@password=@阿里云数据库公网ip:阿里云数据库公网端口号/dbtest?sslmode=disable" --table "tbl_user"
备注:@password=整体作为密码使用。而不是里面的password,这样写是为了说明问题。