news 2026/2/24 12:35:17

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/2/20 13:44:10

Nginx之rewrite重写功能

目录 一、rewrite概述 1、rewrite功能 2、跳转场景 二、标准配置指令 1、rewrite日志记录指令 2、未初始化变量告警日志记录指令 3、rewrite 指令 3.1 正则表达式 三、rewrite模块使用实例 1.基于域名的跳转 2.基于客户端 IP 访问跳转 3.?基于旧域名跳转到新域名后…

作者头像 李华
网站建设 2026/2/21 8:53:12

arduino寻迹小车小白指南:轻松融入机器人课堂

从零开始做一辆“会思考”的小车&#xff1a;Arduino寻迹项目实战教学你有没有试过&#xff0c;写几行代码&#xff0c;就能让一个小车自己沿着黑线跑起来&#xff1f;不是遥控&#xff0c;也不是预设轨道——它真的能“看”路、“判断”方向&#xff0c;甚至在转弯时微微调整速…

作者头像 李华
网站建设 2026/2/21 8:37:12

【MiniMax】基于FastAPI + LangGraph + LLM大语言模型的通用Agent多智能体系统

基于 FastAPI + LangGraph + LLM 大语言模型的通用 Agent 多智能体系统架构设计与开发实战、产业应用 文章目录 基于 FastAPI + LangGraph + LLM 大语言模型的通用 Agent 多智能体系统架构设计与开发实战、产业应用 内容简介 第一部分:理论基础与技术栈概览 第1章 从大语言模型…

作者头像 李华
网站建设 2026/2/21 4:12:31

vivado2022.2安装全流程图文并茂的系统学习资料

Vivado 2022.2 安装实战全攻略&#xff1a;从零搭建高效 FPGA 开发环境 你是否曾因为 Vivado 安装失败而耽误项目进度&#xff1f;是否在下载器卡在 0% 时束手无策&#xff1f;又或者&#xff0c;好不容易装上了却提示“License Checkout Failed”&#xff1f; 别担心&#x…

作者头像 李华
网站建设 2026/2/23 18:22:01

STM32 GPIO控制有源蜂鸣器操作指南

蜂鸣器也能玩出花&#xff1f;用STM32一个GPIO口搞定报警提示音你有没有遇到过这样的场景&#xff1a;调试一块新板子&#xff0c;上电后啥反应都没有——LED不闪、屏幕不亮、串口没输出。这时候要是有个“滴”一声的启动音&#xff0c;至少能告诉你&#xff1a;芯片是活的&…

作者头像 李华
网站建设 2026/2/24 8:36:11

核谱回归(Kernel Spectral Regression)算法详解与MATLAB实现

核谱回归(Kernel Spectral Regression)算法详解与MATLAB实现 在机器学习和数据降维领域,谱回归(Spectral Regression, SR)是一种高效的子空间学习方法,它通过将传统的谱嵌入问题转化为一系列回归问题,大大降低了计算复杂度。当数据分布复杂、呈现非线性结构时,我们常常…

作者头像 李华