JeecgBoot 低代码平台II
最近开始使用 JEECG 搭建新项目,随着深入使用,对这款低代码平台有了更深层次的了解与体验。
postgresql
新项目从一开始就决定使用 PostgreSQL 作为主数据库。但在实际配置过程中发现,官方对 PostgreSQL 的支持文档相对较少,甚至连完整的建表 SQL 脚本都未能直接找到,这对使用者来说无疑增加了上手成本。
尽管如此,JEECG 依然具备良好的兼容性,只是在 PostgreSQL 环境下还需要我们开发者多一些探索和调整。
所幸的是,我们可以使用 navicat 将 mysql 数据库转换成 postgresql 数据库。下面我们重点说下兼容性问题,使用 postgresql 的数据库配置。
datasource:
master:
# url: jdbc:mysql://10.100.10.70:3306/jeecg-boot
# username: root
# password:
# driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:postgresql://10.100.10.154:5432/postgres?characterEncoding=utf8
username: postgres
password:
driver-class-name: org.postgresql.Driver
由于在转换为 PostgreSQL 时字段名被转换为了大写并加上了双引号,导致运行时 SQL 使用小写字段名查询失败,从而抛出 SQL 语法错误。
这个问题可以通过 SQL 脚本手动重命名字段来修复,将字段名统一改为小写、去掉引号,以确保兼容 JEECG 的默认查询语句。
目前已确认受影响的表如下:
- onl_cgform_button
- onl_cgform_enhance_java
- onl_cgform_enhance_js
- onl_cgform_enhance_sql
基于我当前的使用深度,不排除还有其他表存在类似问题,建议在开发初期对相关配置表字段名进行一次性检查与规范。
生成字段转换的sql
SELECT
format(
'ALTER TABLE onl_cgform_button RENAME COLUMN "%s" TO %s;',
column_name,
lower(column_name)
)
FROM information_schema.columns
WHERE table_name = 'onl_cgform_button'
AND column_name <> lower(column_name);
这里列出所有需要执行的 sql 语句
ALTER TABLE onl_cgform_button RENAME COLUMN "ORDER_NUM" TO order_num;
ALTER TABLE onl_cgform_button RENAME COLUMN "BUTTON_ICON" TO button_icon;
ALTER TABLE onl_cgform_button RENAME COLUMN "BUTTON_NAME" TO button_name;
ALTER TABLE onl_cgform_button RENAME COLUMN "BUTTON_STATUS" TO button_status;
ALTER TABLE onl_cgform_button RENAME COLUMN "BUTTON_STYLE" TO button_style;
ALTER TABLE onl_cgform_button RENAME COLUMN "EXP" TO exp;
ALTER TABLE onl_cgform_button RENAME COLUMN "CGFORM_HEAD_ID" TO cgform_head_id;
ALTER TABLE onl_cgform_button RENAME COLUMN "OPT_TYPE" TO opt_type;
ALTER TABLE onl_cgform_button RENAME COLUMN "BUTTON_CODE" TO button_code;
ALTER TABLE onl_cgform_button RENAME COLUMN "OPT_POSITION" TO opt_position;
ALTER TABLE onl_cgform_enhance_java RENAME COLUMN "ID" TO id;
ALTER TABLE onl_cgform_enhance_java RENAME COLUMN "BUTTON_CODE" TO button_code;
ALTER TABLE onl_cgform_enhance_java RENAME COLUMN "CG_JAVA_TYPE" TO cg_java_type;
ALTER TABLE onl_cgform_enhance_java RENAME COLUMN "CG_JAVA_VALUE" TO cg_java_value;
ALTER TABLE onl_cgform_enhance_java RENAME COLUMN "CGFORM_HEAD_ID" TO cgform_head_id;
ALTER TABLE onl_cgform_enhance_java RENAME COLUMN "ACTIVE_STATUS" TO active_status;
ALTER TABLE onl_cgform_enhance_java RENAME COLUMN "EVENT" TO event;
ALTER TABLE onl_cgform_enhance_js RENAME COLUMN "ID" TO id;
ALTER TABLE onl_cgform_enhance_js RENAME COLUMN "CG_JS" TO cg_js;
ALTER TABLE onl_cgform_enhance_js RENAME COLUMN "CG_JS_TYPE" TO cg_js_type;
ALTER TABLE onl_cgform_enhance_js RENAME COLUMN "CONTENT" TO content;
ALTER TABLE onl_cgform_enhance_js RENAME COLUMN "CGFORM_HEAD_ID" TO cgform_head_id;
ALTER TABLE onl_cgform_enhance_sql RENAME COLUMN "ID" TO id;
ALTER TABLE onl_cgform_enhance_sql RENAME COLUMN "BUTTON_CODE" TO button_code;
ALTER TABLE onl_cgform_enhance_sql RENAME COLUMN "CGB_SQL" TO cgb_sql;
ALTER TABLE onl_cgform_enhance_sql RENAME COLUMN "CGB_SQL_NAME" TO cgb_sql_name;
ALTER TABLE onl_cgform_enhance_sql RENAME COLUMN "CONTENT" TO content;
ALTER TABLE onl_cgform_enhance_sql RENAME COLUMN "CGFORM_HEAD_ID" TO cgform_head_id;
还有一段 SQL 是官方提供的 Postgres 兼容修复 sql,一并执行
CREATE OR REPLACE FUNCTION bool_to_int(boolean) RETURNS int2 AS '
SELECT CAST($1::int AS int2);
' LANGUAGE sql STRICT;
CREATE CAST (bool AS int2) WITH FUNCTION bool_to_int(boolean) AS IMPLICIT;
nacos
由于我采用的是 JEECG 的微服务版本,Nacos 成为了服务注册与配置中心的核心组件。为了统一数据库架构,自然也希望将 Nacos 的存储从默认的 MySQL 切换为 PostgreSQL。
虽然 Nacos 官方提供了 PostgreSQL 数据库插件,但这个插件并未打包在发行版本中,需自行下载源码并手动编译生成 JAR 包。
然而实际操作中发现,Nacos 的插件兼容性非常有限:
- 使用 JEECG Boot 源码中集成的 Nacos 项目,插件无法正常加载(疑似版本冲突)。
- 尝试官方最新版本 Nacos 2.5.1,同样无法成功集成插件,甚至启动时报错直接中断。
在多次尝试无果后,最终在社区中找到一位开发者分享:Nacos 2.3.1 可成功集成 PostgreSQL 插件。经过实测,果然这个版本可以稳定运行,看来插件支持确实需要特定版本的配合。
完成插件接入后,下一步是将原 MySQL 中的 Nacos 配置数据迁移至 PostgreSQL。
#*************** Config Module Related Configurations ***************#
### If use MySQL as datasource:
### Deprecated configuration property, it is recommended to use `spring.sql.init.platform` replaced.
spring.datasource.platform=postgresql
# spring.sql.init.platform=postgresql
### Count of DB:
db.num=1
# Connect URL of DB:
db.url.0=jdbc:postgresql://10.100.10.154:5432/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true
db.user=postgres
db.password=
### Connection pool configuration: hikariCP
db.pool.config.connectionTimeout=30000
db.pool.config.validationTimeout=10000
db.pool.config.maximumPoolSize=20
db.pool.config.minimumIdle=2
db.pool.config.driverClassName=org.postgresql.Driver
一切就绪后,启动 nacos。
sh startup.sh -m standalone
部署环境好不容易搭建完成,启动一切正常,但在保存配置时却意外报错。追查日志后发现,问题通常出现在以下两个方面:
- 字段类型不匹配
- 插入数据时缺少默认值
这些问题很可能是由于数据库高低版本之间的兼容性差异引起的。好在只需执行下面这段 SQL 脚本即可修复,环境瞬间恢复正常。
ALTER TABLE his_config_info ALTER COLUMN nid TYPE bigint;
ALTER TABLE his_config_info ALTER COLUMN nid ADD GENERATED ALWAYS AS IDENTITY;
ALTER TABLE his_config_info ALTER COLUMN gmt_create SET DEFAULT now();
✅ 推荐版本组合:Nacos 2.3.1 + JEECG Boot
实测证明,这个组合兼容性良好,无论是服务注册、服务发现,还是配置管理,都能稳定运行,终于找到一个靠谱的搭配方案!