三、RuoYi项目集成金仓数据库

为了适应信创化开发的需要,本文将RuoYi管理系统的数据库从MySQL转换为金仓数据库kingbase,需要修改的地方包括数据库驱动依赖、配置、相关的sql代码等。

本文采用的金仓数据库版本是V8R6,兼容postgresql模式。

数据迁移

数据迁移主要有两种方法,一种是将项目中的数据库初始化sql转换为适配金仓数据库的语法,一种是使用金仓的官方数据库迁移工具,先存入MYSQL数据库中,再迁移到金仓数据库。本文采用第二种方法。

  1. 修改数据库表名。部分表名在金仓数据库中会有冲突,需修改表名
原表名修改表名
sys_configsys_con
sys_rolesys_role_info
sys_usersys_user_info
  1. 使用全局搜索修改xml文件中涉及以上表名的部分
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  2. 数据迁移。打开金仓数据迁移工具,相对位置在Kingbase\ES\V9\ClientTools\guitools\KDts\KDTS-WEB\bin;初始账号和密码分别是账号 kingbase 密码 Kb_DI@2019。具体用法参考文末链接。
    在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

修改驱动配置

安装金仓数据库依赖,修改相关配置

  1. 在pom安装依赖
<properties>
  <kingbase.version>9.0.0</kingbase.version>
</properties>


<!--人大金仓相关-->
<dependency>
  <groupId>cn.com.kingbase</groupId>
  <artifactId>kingbase8</artifactId>
  <version>${kingbase.version}</version>
</dependency>
  1. 修改application.yml的数据源配置
# 数据源配置
spring:
    datasource:
        type: com.alibaba.druid.pool.DruidDataSource
				#  金仓数据库驱动      
        driverClassName: com.kingbase8.Driver
        druid:
            # 主库数据源
            master:
            		# 数据库路径配置必须指定数据库名,最好指定模式名currentSchema
                url: jdbc:kingbase8://10.124.246.172:54321/nbgas_test?currentSchema=exam&allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true
                username: system
                password: xxxxxx
                ... ...

修改相关SQL语句

  1. 修改无法兼容金仓数据库的sql语句,同样采用全局搜索相关的需要修改的文件
搜索原sql示例修改后sql
sysdatesysdate()current_timestamp/now()
find_in_setfind_in_set(#{a}, b)#{a} = ANY(string_to_array(b, ',')::bigint[])#{a} = ANY(string_to_array(b, ',')(无需转 bigint)
date_formatdate_format(u.create_time,‘%Y%m%d’) >= date_format({params.beginTime},‘%Y%m%d’)to_char(u.create_time, '%Y%m%d') &gt;= to_char(to_date(#{params.beginTime}, 'yyyy-MM-dd'),'%Y%m%d' )
concatconcat(‘%’, #{userName}, ‘%’)‘%’ || #{userName} || ‘%’

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  1. 修改代码生成模块的sql语句

    GenTableColumnMapper文件selectDbTableColumnsByName

<select id="selectDbTableColumnsByName" parameterType="String" resultMap="GenTableColumnResult">
        SELECT
        column_name,
        CASE
        WHEN is_nullable = 'NO' AND (constraint_type IS NULL OR constraint_type != 'PRIMARY KEY')
        THEN '1' ELSE '0'
        END AS is_required,
        CASE
        WHEN constraint_type = 'PRIMARY KEY'
        THEN '1' ELSE '0'
        END AS is_pk,
        ordinal_position AS sort,
        column_comment,
        CASE
        WHEN column_default LIKE 'nextval%'
        THEN '1' ELSE '0'
        END AS is_increment,
        data_type AS column_type
        FROM (
        SELECT
        c.column_name,
        c.is_nullable,
        c.ordinal_position,
        c.column_comment,
        c.column_default,
        c.data_type,
        cons.constraint_type
        FROM information_schema.columns c
        LEFT JOIN (
        SELECT
        kcu.column_name,
        tc.constraint_type
        FROM information_schema.table_constraints tc
        JOIN information_schema.key_column_usage kcu
        ON tc.constraint_name = kcu.constraint_name
        AND tc.table_schema = kcu.table_schema
        WHERE tc.table_name = #{tableName}
        AND tc.table_schema = current_schema()
        AND tc.constraint_type IN ('PRIMARY KEY', 'UNIQUE')
        ) cons ON c.column_name = cons.column_name
        WHERE c.table_schema = current_schema()
        AND c.table_name = #{tableName}
        ) t
        ORDER BY sort
    </select>

​ GenTableMapper文件三个方法


	<select id="selectDbTableList" parameterType="GenTable" resultMap="GenTableResult">
		SELECT
		relname AS table_name,
		obj_description(c.oid) AS table_comment,
		stat.modification AS create_time,
		NULL AS update_time
		FROM pg_class c
		JOIN pg_namespace n ON n.oid = c.relnamespace
		LEFT JOIN pg_stat_file(pg_relation_filepath(c.oid)) AS stat ON true
		WHERE n.nspname = current_schema()
		AND c.relkind = 'r'  -- 只包含常规表
		AND relname NOT LIKE 'qrtz\_%' ESCAPE '\'
		AND relname NOT LIKE 'gen\_%' ESCAPE '\'
		AND relname NOT IN (SELECT table_name FROM gen_table)
		<if test="tableName != null and tableName != ''">
			AND lower(relname) LIKE '%' || lower(#{tableName}) || '%'
		</if>
		<if test="tableComment != null and tableComment != ''">
			AND lower(obj_description(c.oid)) LIKE '%' || lower(#{tableComment}) || '%'
		</if>
		<if test="params.beginTime != null and params.beginTime != ''">
			AND stat.modification &gt;= to_timestamp(#{params.beginTime}, 'YYYY-MM-DD')
		</if>
		<if test="params.endTime != null and params.endTime != ''">
			AND stat.modification &lt;= to_timestamp(#{params.endTime}, 'YYYY-MM-DD') + interval '1 day'
		</if>
		ORDER BY create_time DESC
	</select>

	<select id="selectDbTableListByNames" resultMap="GenTableResult">
		SELECT
		c.relname AS table_name,  -- 表名(与第一个SQL一致)
		obj_description(c.oid) AS table_comment,  -- 表注释(使用obj_description函数)
		stat.modification AS create_time,  -- 创建时间(关联pg_stat_file获取)
		NULL AS update_time  -- 统一设为NULL(与第一个SQL保持一致)
		FROM pg_class c
		JOIN pg_namespace n ON n.oid = c.relnamespace  -- 关联命名空间(模式)
		LEFT JOIN pg_stat_file(pg_relation_filepath(c.oid)) AS stat ON true  -- 关联文件元数据获取时间
		WHERE
		n.nspname = current_schema()  -- 匹配当前模式(与第一个SQL一致)
		AND c.relkind = 'r'  -- 只包含常规表(与第一个SQL一致)
		AND c.relname NOT LIKE 'qrtz\_%' ESCAPE '\'  -- 排除qrtz_前缀表
		AND c.relname NOT LIKE 'gen\_%' ESCAPE '\'  -- 排除gen_前缀表
		AND c.relname IN  -- 匹配传入的表名列表
		<foreach collection="array" item="name" open="(" separator="," close=")">
			#{name}
		</foreach>
	</select>

	<select id="selectTableByName" parameterType="String" resultMap="GenTableResult">
		SELECT
			c.relname AS table_name,  -- 表名
			obj_description(c.oid) AS table_comment,  -- 表注释(替代原table_comment)
			stat.modification AS create_time,  -- 创建时间
			NULL AS update_time  -- 统一设为NULL
		FROM pg_class c
				 JOIN pg_namespace n ON n.oid = c.relnamespace  -- 关联命名空间
				 LEFT JOIN pg_stat_file(pg_relation_filepath(c.oid)) AS stat ON true  -- 关联文件元数据
		WHERE
			c.relkind = 'r'  -- 只查常规表(与第一个SQL一致)
		  AND obj_description(c.oid) <![CDATA[ <> ]]> ''  -- 表注释非空(替代原table_comment条件)
		  AND obj_description(c.oid) IS NOT NULL  -- 补充非空判断
		  AND n.nspname = current_database()  -- 匹配当前数据库(保留原逻辑)
		  AND c.relname = #{tableName}  -- 匹配目标表名
	</select>

修改生成代码模版

替换sql.vm文件所有内容

WITH parent_menu AS (
INSERT INTO sys_menu (
menu_name, parent_id, order_num, path, component, is_frame, is_cache,
menu_type, visible, status, perms, icon, create_by, create_time,
update_by, update_time, remark
)
VALUES (
'${functionName}',
${parentMenuId},
'1',
'${businessName}',
'${moduleName}/${businessName}/index',
1,
0,
'C',
'0',
'0',
'${permissionPrefix}:list',
'#',
'admin',
CURRENT_TIMESTAMP,
NULL,
NULL,
'${functionName}菜单'
)
RETURNING menu_id
)
INSERT INTO sys_menu (
menu_name, parent_id, order_num, path, component, is_frame, is_cache,
menu_type, visible, status, perms, icon, create_by, create_time,
update_by, update_time, remark
)
SELECT
col1, col2, col3, col4, col5, col6, col7, col8, col9, col10, col11,
'#', 'admin', CURRENT_TIMESTAMP, NULL, NULL, ''
FROM (
VALUES
('${functionName}查询', (SELECT menu_id FROM parent_menu), '1', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:query'),
('${functionName}新增', (SELECT menu_id FROM parent_menu), '2', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:add'),
('${functionName}修改', (SELECT menu_id FROM parent_menu), '3', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:edit'),
('${functionName}删除', (SELECT menu_id FROM parent_menu), '4', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:remove'),
('${functionName}导出', (SELECT menu_id FROM parent_menu), '5', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:export')
) AS menu_data(
col1, col2, col3, col4, col5, col6, col7, col8, col9, col10, col11
);

参考代码和网站连接:

RuoYi-Vue3 前端
RuoYi-Vue-Boot-2.x 后端
RuoYi-Vue的金仓数据库版本
RuoYi-Vue的多租户后台管理系统
集成mybatis-plus实现mybatis增强

国产化适配之人大金仓数据库(二)数据迁移

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值