news 2026/4/16 17:57:29

nacos2.3.0 接入pgsql或其他数据库

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
nacos2.3.0 接入pgsql或其他数据库

首先尝试使用官方插件进行扩展,各种报错后放弃,不如自己修改源码吧。

一、官方解决方案

1、nocos 文档地址:Nacos 配置中心简介, Nacos 是什么 | Nacos 官网

2、官方解答:nacos支持postgresql数据库吗 | Nacos 官网
3、源码下载地址:Release 2.3.0 (Nov 30, 2023) · alibaba/nacos · GitHub

4、Nacos的数据库插件仓库:nacos-plugin/nacos-datasource-plugin-ext at develop · nacos-group/nacos-plugin · GitHub

按照官方的方案,下载插件后,更改pom文件中nacos的版本,之后将插件打成jar包,放到nacos的plugins目录下,更改配置,启动后各种报错找不到方法,遂放弃。

二、更改源码

1、在项目根(nacos-all)下的pom.xml文件中添加如下依赖:

<postgresql.version>42.3.8</postgresql.version>

org.postgresql postgresql ${postgresql.version}

2、在项目的nacos-config-plugin、nacos-persistence模块的pom.xml文件中添加如下依赖:

org.postgresql postgresql

3、在项目的nacos-plugin模块的nacos-datasource-plugin模块com.alibaba.nacos.plugin.datasource.impl包下新建一个包,名为postgresql,拷贝同级包mysql下的所有文件到postgresql包下,修改类名和文件名为xxxByPostgresql,如图

4、将这几个类中LIMIT ?,?的写法为OFFSET ? LIMIT ? 如图

5、在改项目resource目录下,找到com.alibaba.nacos.plugin.datasource.mapper.Mapper文件,在后面追加:

com.alibaba.nacos.plugin.datasource.impl.postgresql.ConfigInfoAggrMapperByPostgresql
com.alibaba.nacos.plugin.datasource.impl.postgresql.ConfigInfoBetaMapperByPostgresql
com.alibaba.nacos.plugin.datasource.impl.postgresql.ConfigInfoMapperByPostgresql
com.alibaba.nacos.plugin.datasource.impl.postgresql.ConfigInfoTagMapperByPostgresql
com.alibaba.nacos.plugin.datasource.impl.postgresql.ConfigTagsRelationMapperByPostgresql
com.alibaba.nacos.plugin.datasource.impl.postgresql.HistoryConfigInfoMapperByPostgresql
com.alibaba.nacos.plugin.datasource.impl.postgresql.TenantInfoMapperByPostgresql
com.alibaba.nacos.plugin.datasource.impl.postgresql.TenantCapacityMapperByPostgresql
com.alibaba.nacos.plugin.datasource.impl.postgresql.GroupCapacityMapperByPostgresql

如图:

6、在DataSourceConstant类中增加pgsql的常量

public static final String POSTGRESQL = "postgresql";

7、persistence模块,修改PersistenceConstant

public static final String POSTGRESQL = "postgresql";

修改ExternalDataSourceProperties类

代码如下,直接复制粘贴即可:

/* * Copyright 1999-2023 Alibaba Group Holding Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.alibaba.nacos.persistence.datasource; import com.alibaba.nacos.common.utils.CollectionUtils; import com.alibaba.nacos.common.utils.Preconditions; import com.alibaba.nacos.common.utils.StringUtils; import com.zaxxer.hikari.HikariDataSource; import org.springframework.boot.context.properties.bind.Bindable; import org.springframework.boot.context.properties.bind.Binder; import org.springframework.core.env.Environment; import java.util.ArrayList; import java.util.List; import java.util.Objects; import static com.alibaba.nacos.common.utils.CollectionUtils.getOrDefault; /** * Properties of external DataSource. * * @author Nacos */ public class ExternalDataSourceProperties { private static final String JDBC_DRIVER_NAME = "com.mysql.cj.jdbc.Driver"; private static final String TEST_QUERY = "SELECT 1"; private Integer num; private List<String> url = new ArrayList<>(); private List<String> user = new ArrayList<>(); private List<String> password = new ArrayList<>(); private String jdbcDriverName; public void setJdbcDriverName(String jdbcDriverName) { if (StringUtils.isBlank(jdbcDriverName)) { this.jdbcDriverName = JDBC_DRIVER_NAME; } else { this.jdbcDriverName = jdbcDriverName; } } public void setNum(Integer num) { this.num = num; } public void setUrl(List<String> url) { this.url = url; } public void setUser(List<String> user) { this.user = user; } public void setPassword(List<String> password) { this.password = password; } /** * Build serveral HikariDataSource. * * @param environment {@link Environment} * @param callback Callback function when constructing data source * @return List of {@link HikariDataSource} */ List<HikariDataSource> build(Environment environment, Callback<HikariDataSource> callback) { List<HikariDataSource> dataSources = new ArrayList<>(); Binder.get(environment).bind("db", Bindable.ofInstance(this)); Preconditions.checkArgument(Objects.nonNull(num), "db.num is null"); Preconditions.checkArgument(CollectionUtils.isNotEmpty(user), "db.user or db.user.[index] is null"); Preconditions.checkArgument(CollectionUtils.isNotEmpty(password), "db.password or db.password.[index] is null"); for (int index = 0; index < num; index++) { int currentSize = index + 1; Preconditions.checkArgument(url.size() >= currentSize, "db.url.%s is null", index); DataSourcePoolProperties poolProperties = DataSourcePoolProperties.build(environment); if (StringUtils.isEmpty(poolProperties.getDataSource().getDriverClassName())) { poolProperties.setDriverClassName(jdbcDriverName); } poolProperties.setJdbcUrl(url.get(index).trim()); poolProperties.setUsername(getOrDefault(user, index, user.get(0)).trim()); poolProperties.setPassword(getOrDefault(password, index, password.get(0)).trim()); HikariDataSource ds = poolProperties.getDataSource(); if (StringUtils.isEmpty(ds.getConnectionTestQuery())) { ds.setConnectionTestQuery(TEST_QUERY); } dataSources.add(ds); callback.accept(ds); } Preconditions.checkArgument(CollectionUtils.isNotEmpty(dataSources), "no datasource available"); return dataSources; } interface Callback<D> { /** * Perform custom logic. * * @param datasource dataSource. */ void accept(D datasource); } }

8、plugins-defualt-impl模块,子模块nacos-default-auth-plugin中,修改AuthPageConstant,加入以下代码

public static final String OFFSET_LIMIT = "OFFSET ? LIMIT ?";

persistence.handler.support中新增PostgreSqlPageHandlerAdapter类,如图:

代码如下:

package com.alibaba.nacos.plugin.auth.impl.persistence.handler.support; import com.alibaba.nacos.config.server.service.dump.DumpService; import com.alibaba.nacos.persistence.constants.PersistenceConstant; import com.alibaba.nacos.plugin.auth.impl.constant.AuthPageConstant; import com.alibaba.nacos.plugin.auth.impl.model.OffsetFetchResult; import com.alibaba.nacos.plugin.auth.impl.persistence.handler.PageHandlerAdapter; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.ArrayList; import java.util.Arrays; import java.util.List; /** * @author w */ public class PostgreSqlPageHandlerAdapter implements PageHandlerAdapter { @Override public boolean supports(String dataSourceType) { return PersistenceConstant.POSTGRESQL.equals(dataSourceType); } @Override public OffsetFetchResult addOffsetAndFetchNext(String fetchSql, Object[] arg, int pageNo, int pageSize) { if (!fetchSql.contains(AuthPageConstant.LIMIT)) { fetchSql += " " + AuthPageConstant.OFFSET_LIMIT; List<Object> newArgsList = new ArrayList<>(Arrays.asList(arg)); newArgsList.add((pageNo - 1) * pageSize); newArgsList.add(pageSize); Object[] newArgs = newArgsList.toArray(new Object[newArgsList.size()]); return new OffsetFetchResult(fetchSql, newArgs); } return new OffsetFetchResult(fetchSql, arg); } }

在 PageHandlerAdapterFactory 类中加入以下代码:

9、最终,执行打包命令

mvn -Prelease-nacos clean install -Dmaven.test.skip=true -Dcheckstyle.skip=true -Dpmd.skip=true -Drat.skip=true -U

根据需求,在nacos-2.3.0distribution arget 目录下找到打好的包

修改配置文件,记得将数据库ip、库名、schema名称、用户名、密码配置改成自己的:

spring.datasource.platform=postgresql db.num=1 db.url.0=jdbc:postgresql://xxxx:5432/nacos?currentSchema=public&reWriteBatchedInserts=true&useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai db.user.0=xxxx db.password.0=xxxx db.pool.config.driverClassName=org.postgresql.Driver nacos.core.auth.plugin.nacos.token.secret.key=SecretKey012345678901234567890123456789012345678901234567890123456789 nacos.core.auth.enabled=true nacos.core.auth.caching.enabled=false nacos.core.auth.server.identity.key=nacos nacos.core.auth.server.identity.value=nacos

最终,祝大家成功!!!

附上pg数据库脚本:

/* * Copyright 1999-2018 Alibaba Group Holding Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ -- ---------------------------- -- Table structure for config_info -- ---------------------------- DROP TABLE IF EXISTS "config_info"; CREATE TABLE "config_info" ( "id" bigserial NOT NULL, "data_id" varchar(255) NOT NULL, "group_id" varchar(255) , "content" text NOT NULL, "md5" varchar(32) , "gmt_create" timestamp(6) NOT NULL, "gmt_modified" timestamp(6) NOT NULL, "src_user" text , "src_ip" varchar(20) , "app_name" varchar(128) , "tenant_id" varchar(128) , "c_desc" varchar(256) , "c_use" varchar(64) , "effect" varchar(64) , "type" varchar(64) , "c_schema" text , "encrypted_data_key" text NOT NULL ) ; COMMENT ON COLUMN "config_info"."id" IS 'id'; COMMENT ON COLUMN "config_info"."data_id" IS 'data_id'; COMMENT ON COLUMN "config_info"."content" IS 'content'; COMMENT ON COLUMN "config_info"."md5" IS 'md5'; COMMENT ON COLUMN "config_info"."gmt_create" IS '创建时间'; COMMENT ON COLUMN "config_info"."gmt_modified" IS '修改时间'; COMMENT ON COLUMN "config_info"."src_user" IS 'source user'; COMMENT ON COLUMN "config_info"."src_ip" IS 'source ip'; COMMENT ON COLUMN "config_info"."tenant_id" IS '租户字段'; COMMENT ON COLUMN "config_info"."encrypted_data_key" IS '秘钥'; COMMENT ON TABLE "config_info" IS 'config_info'; -- ---------------------------- -- Table structure for config_info_aggr -- ---------------------------- DROP TABLE IF EXISTS "config_info_aggr"; CREATE TABLE "config_info_aggr" ( "id" bigserial NOT NULL, "data_id" varchar(255) NOT NULL, "group_id" varchar(255) NOT NULL, "datum_id" varchar(255) NOT NULL, "content" text NOT NULL, "gmt_modified" timestamp(6) NOT NULL, "app_name" varchar(128) , "tenant_id" varchar(128) ) ; COMMENT ON COLUMN "config_info_aggr"."id" IS 'id'; COMMENT ON COLUMN "config_info_aggr"."data_id" IS 'data_id'; COMMENT ON COLUMN "config_info_aggr"."group_id" IS 'group_id'; COMMENT ON COLUMN "config_info_aggr"."datum_id" IS 'datum_id'; COMMENT ON COLUMN "config_info_aggr"."content" IS '内容'; COMMENT ON COLUMN "config_info_aggr"."gmt_modified" IS '修改时间'; COMMENT ON COLUMN "config_info_aggr"."tenant_id" IS '租户字段'; COMMENT ON TABLE "config_info_aggr" IS '增加租户字段'; -- ---------------------------- -- Records of config_info_aggr -- ---------------------------- BEGIN; COMMIT; -- ---------------------------- -- Table structure for config_info_beta -- ---------------------------- DROP TABLE IF EXISTS "config_info_beta"; CREATE TABLE "config_info_beta" ( "id" bigserial NOT NULL, "data_id" varchar(255) NOT NULL, "group_id" varchar(128) NOT NULL, "app_name" varchar(128) , "content" text NOT NULL, "beta_ips" varchar(1024) , "md5" varchar(32) , "gmt_create" timestamp(6) NOT NULL, "gmt_modified" timestamp(6) NOT NULL, "src_user" text , "src_ip" varchar(20) , "tenant_id" varchar(128) , "encrypted_data_key" text NOT NULL ) ; COMMENT ON COLUMN "config_info_beta"."id" IS 'id'; COMMENT ON COLUMN "config_info_beta"."data_id" IS 'data_id'; COMMENT ON COLUMN "config_info_beta"."group_id" IS 'group_id'; COMMENT ON COLUMN "config_info_beta"."app_name" IS 'app_name'; COMMENT ON COLUMN "config_info_beta"."content" IS 'content'; COMMENT ON COLUMN "config_info_beta"."beta_ips" IS 'betaIps'; COMMENT ON COLUMN "config_info_beta"."md5" IS 'md5'; COMMENT ON COLUMN "config_info_beta"."gmt_create" IS '创建时间'; COMMENT ON COLUMN "config_info_beta"."gmt_modified" IS '修改时间'; COMMENT ON COLUMN "config_info_beta"."src_user" IS 'source user'; COMMENT ON COLUMN "config_info_beta"."src_ip" IS 'source ip'; COMMENT ON COLUMN "config_info_beta"."tenant_id" IS '租户字段'; COMMENT ON COLUMN "config_info_beta"."encrypted_data_key" IS '秘钥'; COMMENT ON TABLE "config_info_beta" IS 'config_info_beta'; -- ---------------------------- -- Records of config_info_beta -- ---------------------------- BEGIN; COMMIT; -- ---------------------------- -- Table structure for config_info_tag -- ---------------------------- DROP TABLE IF EXISTS "config_info_tag"; CREATE TABLE "config_info_tag" ( "id" bigserial NOT NULL, "data_id" varchar(255) NOT NULL, "group_id" varchar(128) NOT NULL, "tenant_id" varchar(128) , "tag_id" varchar(128) NOT NULL, "app_name" varchar(128) , "content" text NOT NULL, "md5" varchar(32) , "gmt_create" timestamp(6) NOT NULL, "gmt_modified" timestamp(6) NOT NULL, "src_user" text , "src_ip" varchar(20) ) ; COMMENT ON COLUMN "config_info_tag"."id" IS 'id'; COMMENT ON COLUMN "config_info_tag"."data_id" IS 'data_id'; COMMENT ON COLUMN "config_info_tag"."group_id" IS 'group_id'; COMMENT ON COLUMN "config_info_tag"."tenant_id" IS 'tenant_id'; COMMENT ON COLUMN "config_info_tag"."tag_id" IS 'tag_id'; COMMENT ON COLUMN "config_info_tag"."app_name" IS 'app_name'; COMMENT ON COLUMN "config_info_tag"."content" IS 'content'; COMMENT ON COLUMN "config_info_tag"."md5" IS 'md5'; COMMENT ON COLUMN "config_info_tag"."gmt_create" IS '创建时间'; COMMENT ON COLUMN "config_info_tag"."gmt_modified" IS '修改时间'; COMMENT ON COLUMN "config_info_tag"."src_user" IS 'source user'; COMMENT ON COLUMN "config_info_tag"."src_ip" IS 'source ip'; COMMENT ON TABLE "config_info_tag" IS 'config_info_tag'; -- ---------------------------- -- Records of config_info_tag -- ---------------------------- BEGIN; COMMIT; -- ---------------------------- -- Table structure for config_tags_relation -- ---------------------------- DROP TABLE IF EXISTS "config_tags_relation"; CREATE TABLE "config_tags_relation" ( "id" bigserial NOT NULL, "tag_name" varchar(128) NOT NULL, "tag_type" varchar(64) , "data_id" varchar(255) NOT NULL, "group_id" varchar(128) NOT NULL, "tenant_id" varchar(128) , "nid" bigserial NOT NULL ) ; COMMENT ON COLUMN "config_tags_relation"."id" IS 'id'; COMMENT ON COLUMN "config_tags_relation"."tag_name" IS 'tag_name'; COMMENT ON COLUMN "config_tags_relation"."tag_type" IS 'tag_type'; COMMENT ON COLUMN "config_tags_relation"."data_id" IS 'data_id'; COMMENT ON COLUMN "config_tags_relation"."group_id" IS 'group_id'; COMMENT ON COLUMN "config_tags_relation"."tenant_id" IS 'tenant_id'; COMMENT ON TABLE "config_tags_relation" IS 'config_tag_relation'; -- ---------------------------- -- Records of config_tags_relation -- ---------------------------- BEGIN; COMMIT; -- ---------------------------- -- Table structure for group_capacity -- ---------------------------- DROP TABLE IF EXISTS "group_capacity"; CREATE TABLE "group_capacity" ( "id" bigserial NOT NULL, "group_id" varchar(128) NOT NULL, "quota" int4 NOT NULL, "usage" int4 NOT NULL, "max_size" int4 NOT NULL, "max_aggr_count" int4 NOT NULL, "max_aggr_size" int4 NOT NULL, "max_history_count" int4 NOT NULL, "gmt_create" timestamp(6) NOT NULL, "gmt_modified" timestamp(6) NOT NULL ) ; COMMENT ON COLUMN "group_capacity"."id" IS '主键ID'; COMMENT ON COLUMN "group_capacity"."group_id" IS 'Group ID,空字符表示整个集群'; COMMENT ON COLUMN "group_capacity"."quota" IS '配额,0表示使用默认值'; COMMENT ON COLUMN "group_capacity"."usage" IS '使用量'; COMMENT ON COLUMN "group_capacity"."max_size" IS '单个配置大小上限,单位为字节,0表示使用默认值'; COMMENT ON COLUMN "group_capacity"."max_aggr_count" IS '聚合子配置最大个数,,0表示使用默认值'; COMMENT ON COLUMN "group_capacity"."max_aggr_size" IS '单个聚合数据的子配置大小上限,单位为字节,0表示使用默认值'; COMMENT ON COLUMN "group_capacity"."max_history_count" IS '最大变更历史数量'; COMMENT ON COLUMN "group_capacity"."gmt_create" IS '创建时间'; COMMENT ON COLUMN "group_capacity"."gmt_modified" IS '修改时间'; COMMENT ON TABLE "group_capacity" IS '集群、各Group容量信息表'; -- ---------------------------- -- Records of group_capacity -- ---------------------------- BEGIN; COMMIT; -- ---------------------------- -- Table structure for his_config_info -- ---------------------------- DROP TABLE IF EXISTS "his_config_info"; CREATE TABLE "his_config_info" ( "id" int8 NOT NULL, "nid" bigserial NOT NULL, "data_id" varchar(255) NOT NULL, "group_id" varchar(128) NOT NULL, "app_name" varchar(128) , "content" text NOT NULL, "md5" varchar(32) , "gmt_create" timestamp(6) NOT NULL DEFAULT '2010-05-05 00:00:00', "gmt_modified" timestamp(6) NOT NULL, "src_user" text , "src_ip" varchar(20) , "op_type" char(10) , "tenant_id" varchar(128) , "encrypted_data_key" text NOT NULL ) ; COMMENT ON COLUMN "his_config_info"."app_name" IS 'app_name'; COMMENT ON COLUMN "his_config_info"."tenant_id" IS '租户字段'; COMMENT ON COLUMN "his_config_info"."encrypted_data_key" IS '秘钥'; COMMENT ON TABLE "his_config_info" IS '多租户改造'; -- ---------------------------- -- Table structure for permissions -- ---------------------------- DROP TABLE IF EXISTS "permissions"; CREATE TABLE "permissions" ( "role" varchar(50) NOT NULL, "resource" varchar(512) NOT NULL, "action" varchar(8) NOT NULL ) ; -- ---------------------------- -- Records of permissions -- ---------------------------- BEGIN; COMMIT; -- ---------------------------- -- Table structure for roles -- ---------------------------- DROP TABLE IF EXISTS "roles"; CREATE TABLE "roles" ( "username" varchar(50) NOT NULL, "role" varchar(50) NOT NULL ) ; -- ---------------------------- -- Records of roles -- ---------------------------- BEGIN; INSERT INTO "roles" VALUES ('nacos', 'ROLE_ADMIN'); COMMIT; -- ---------------------------- -- Table structure for tenant_capacity -- ---------------------------- DROP TABLE IF EXISTS "tenant_capacity"; CREATE TABLE "tenant_capacity" ( "id" bigserial NOT NULL, "tenant_id" varchar(128) NOT NULL, "quota" int4 NOT NULL, "usage" int4 NOT NULL, "max_size" int4 NOT NULL, "max_aggr_count" int4 NOT NULL, "max_aggr_size" int4 NOT NULL, "max_history_count" int4 NOT NULL, "gmt_create" timestamp(6) NOT NULL, "gmt_modified" timestamp(6) NOT NULL ) ; COMMENT ON COLUMN "tenant_capacity"."id" IS '主键ID'; COMMENT ON COLUMN "tenant_capacity"."tenant_id" IS 'Tenant ID'; COMMENT ON COLUMN "tenant_capacity"."quota" IS '配额,0表示使用默认值'; COMMENT ON COLUMN "tenant_capacity"."usage" IS '使用量'; COMMENT ON COLUMN "tenant_capacity"."max_size" IS '单个配置大小上限,单位为字节,0表示使用默认值'; COMMENT ON COLUMN "tenant_capacity"."max_aggr_count" IS '聚合子配置最大个数'; COMMENT ON COLUMN "tenant_capacity"."max_aggr_size" IS '单个聚合数据的子配置大小上限,单位为字节,0表示使用默认值'; COMMENT ON COLUMN "tenant_capacity"."max_history_count" IS '最大变更历史数量'; COMMENT ON COLUMN "tenant_capacity"."gmt_create" IS '创建时间'; COMMENT ON COLUMN "tenant_capacity"."gmt_modified" IS '修改时间'; COMMENT ON TABLE "tenant_capacity" IS '租户容量信息表'; -- ---------------------------- -- Records of tenant_capacity -- ---------------------------- BEGIN; COMMIT; -- ---------------------------- -- Table structure for tenant_info -- ---------------------------- DROP TABLE IF EXISTS "tenant_info"; CREATE TABLE "tenant_info" ( "id" bigserial NOT NULL, "kp" varchar(128) NOT NULL, "tenant_id" varchar(128) , "tenant_name" varchar(128) , "tenant_desc" varchar(256) , "create_source" varchar(32) , "gmt_create" int8 NOT NULL, "gmt_modified" int8 NOT NULL ) ; COMMENT ON COLUMN "tenant_info"."id" IS 'id'; COMMENT ON COLUMN "tenant_info"."kp" IS 'kp'; COMMENT ON COLUMN "tenant_info"."tenant_id" IS 'tenant_id'; COMMENT ON COLUMN "tenant_info"."tenant_name" IS 'tenant_name'; COMMENT ON COLUMN "tenant_info"."tenant_desc" IS 'tenant_desc'; COMMENT ON COLUMN "tenant_info"."create_source" IS 'create_source'; COMMENT ON COLUMN "tenant_info"."gmt_create" IS '创建时间'; COMMENT ON COLUMN "tenant_info"."gmt_modified" IS '修改时间'; COMMENT ON TABLE "tenant_info" IS 'tenant_info'; -- ---------------------------- -- Records of tenant_info -- ---------------------------- BEGIN; COMMIT; -- ---------------------------- -- Table structure for users -- ---------------------------- DROP TABLE IF EXISTS "users"; CREATE TABLE "users" ( "username" varchar(50) NOT NULL, "password" varchar(500) NOT NULL, "enabled" boolean NOT NULL ) ; -- ---------------------------- -- Records of users -- ---------------------------- BEGIN; INSERT INTO "users" VALUES ('nacos', '$2a$10$EuWPZHzz32dJN7jexM34MOeYirDdFAZm2kuWj7VEOJhhZkDrxfvUu', TRUE); COMMIT; -- ---------------------------- -- Indexes structure for table config_info -- ---------------------------- CREATE UNIQUE INDEX "uk_configinfo_datagrouptenant" ON "config_info" ("data_id","group_id","tenant_id"); -- ---------------------------- -- Primary Key structure for table config_info -- ---------------------------- ALTER TABLE "config_info" ADD CONSTRAINT "config_info_pkey" PRIMARY KEY ("id"); -- ---------------------------- -- Indexes structure for table config_info_aggr -- ---------------------------- CREATE UNIQUE INDEX "uk_configinfoaggr_datagrouptenantdatum" ON "config_info_aggr" USING btree ("data_id","group_id","tenant_id","datum_id"); -- ---------------------------- -- Primary Key structure for table config_info_aggr -- ---------------------------- ALTER TABLE "config_info_aggr" ADD CONSTRAINT "config_info_aggr_pkey" PRIMARY KEY ("id"); -- ---------------------------- -- Indexes structure for table config_info_beta -- ---------------------------- CREATE UNIQUE INDEX "uk_configinfobeta_datagrouptenant" ON "config_info_beta" USING btree ("data_id","group_id","tenant_id"); -- ---------------------------- -- Primary Key structure for table config_info_beta -- ---------------------------- ALTER TABLE "config_info_beta" ADD CONSTRAINT "config_info_beta_pkey" PRIMARY KEY ("id"); -- ---------------------------- -- Indexes structure for table config_info_tag -- ---------------------------- CREATE UNIQUE INDEX "uk_configinfotag_datagrouptenanttag" ON "config_info_tag" USING btree ("data_id","group_id","tenant_id","tag_id"); -- ---------------------------- -- Primary Key structure for table config_info_tag -- ---------------------------- ALTER TABLE "config_info_tag" ADD CONSTRAINT "config_info_tag_pkey" PRIMARY KEY ("id"); -- ---------------------------- -- Indexes structure for table config_tags_relation -- ---------------------------- CREATE INDEX "idx_tenant_id" ON "config_tags_relation" USING btree ( "tenant_id" ); CREATE UNIQUE INDEX "uk_configtagrelation_configidtag" ON "config_tags_relation" USING btree ( "id", "tag_name", "tag_type" ); -- ---------------------------- -- Primary Key structure for table config_tags_relation -- ---------------------------- ALTER TABLE "config_tags_relation" ADD CONSTRAINT "config_tags_relation_pkey" PRIMARY KEY ("nid"); -- ---------------------------- -- Indexes structure for table group_capacity -- ---------------------------- CREATE UNIQUE INDEX "uk_group_id" ON "group_capacity" USING btree ( "group_id" ); -- ---------------------------- -- Primary Key structure for table group_capacity -- ---------------------------- ALTER TABLE "group_capacity" ADD CONSTRAINT "group_capacity_pkey" PRIMARY KEY ("id"); -- ---------------------------- -- Indexes structure for table his_config_info -- ---------------------------- CREATE INDEX "idx_did" ON "his_config_info" USING btree ( "data_id" ); CREATE INDEX "idx_gmt_create" ON "his_config_info" USING btree ( "gmt_create" ); CREATE INDEX "idx_gmt_modified" ON "his_config_info" USING btree ( "gmt_modified" ); -- ---------------------------- -- Primary Key structure for table his_config_info -- ---------------------------- ALTER TABLE "his_config_info" ADD CONSTRAINT "his_config_info_pkey" PRIMARY KEY ("nid"); -- ---------------------------- -- Indexes structure for table permissions -- ---------------------------- CREATE UNIQUE INDEX "uk_role_permission" ON "permissions" USING btree ( "role", "resource", "action" ); -- ---------------------------- -- Indexes structure for table roles -- ---------------------------- CREATE UNIQUE INDEX "uk_username_role" ON "roles" USING btree ( "username", "role" ); -- ---------------------------- -- Indexes structure for table tenant_capacity -- ---------------------------- CREATE UNIQUE INDEX "uk_tenant_id" ON "tenant_capacity" USING btree ( "tenant_id" ); -- ---------------------------- -- Primary Key structure for table tenant_capacity -- ---------------------------- ALTER TABLE "tenant_capacity" ADD CONSTRAINT "tenant_capacity_pkey" PRIMARY KEY ("id"); -- ---------------------------- -- Indexes structure for table tenant_info -- ---------------------------- CREATE UNIQUE INDEX "uk_tenant_info_kptenantid" ON "tenant_info" USING btree ( "kp", "tenant_id" );
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/16 0:39:08

基于STM32的工业控制ISR配置手把手教程

手把手教你打造工业级实时响应系统&#xff1a;STM32中断配置实战全解析在工厂的自动化产线上&#xff0c;一个电机突然过流&#xff0c;控制系统必须在几毫秒内切断电源&#xff1b;一台机器人手臂接近障碍物&#xff0c;安全光栅信号必须被立即捕获并处理&#xff1b;PLC需要…

作者头像 李华
网站建设 2026/4/16 12:00:03

STM32开发入门:Keil5安装与配置手把手教程

从零开始搭建STM32开发环境&#xff1a;Keil5安装与配置实战指南 你是不是也曾在准备动手写第一行代码时&#xff0c;被一堆工具链、驱动和配置项搞得晕头转向&#xff1f;明明只是想点亮一个LED&#xff0c;却卡在“无法连接目标”或者“找不到芯片”这种问题上。别急——这几…

作者头像 李华
网站建设 2026/4/16 12:33:42

Multisim汉化实战:软件层修改完整指南

Multisim汉化实战&#xff1a;从资源修改到自动化部署的完整技术路径你有没有遇到过这样的场景&#xff1f;打开Multisim准备做电路仿真&#xff0c;刚点开“Place”菜单就卡住了——Ground是接地还是电源&#xff1f;Probe到底该译成“探针”还是“探测器”&#xff1f;对于初…

作者头像 李华
网站建设 2026/4/16 12:44:05

工业网关开发中的CubeMX安装避坑指南

工业网关开发实战&#xff1a;STM32CubeMX安装避坑全记录 在我们最近的一个工业边缘计算项目中&#xff0c;团队刚拿到新设计的STM32H743核心板&#xff0c;准备着手开发支持Modbus、CAN和以太网协议转换的智能网关。一切就绪&#xff0c;却卡在了最基础的一环—— STM32Cube…

作者头像 李华
网站建设 2026/4/2 6:46:46

工业控制设备PCB图入门必看基础指南

看懂工业控制设备PCB图&#xff1a;从“天书”到实战的硬核入门指南你有没有过这样的经历&#xff1f;手里拿着一块布满密密麻麻走线和元器件的工业控制板&#xff0c;打开配套原理图却一头雾水——这个引脚到底连到哪儿了&#xff1f;那根细如发丝的走线是干什么用的&#xff…

作者头像 李华
网站建设 2026/4/16 11:14:18

AI 领域中的 Prompt(提示词/提示)是什么?

AI 领域中的 Prompt&#xff08;提示词/提示&#xff09;是什么&#xff1f;一、核心定义 Prompt&#xff0c;在人工智能领域&#xff0c;特指用户输入给大语言模型或其他生成式AI模型的指令、问题、上下文或信息片段&#xff0c;旨在引导模型产生符合期望的输出。 简单比喻&am…

作者头像 李华