为了适应信创化开发的需要,本文将RuoYi管理系统的数据库从
MySQL转换为金仓数据库kingbase,需要修改的地方包括数据库驱动依赖、配置、相关的sql代码等。
本文采用的金仓数据库版本是V8R6,兼容postgresql模式。
数据迁移
数据迁移主要有两种方法,一种是将项目中的数据库初始化sql转换为适配金仓数据库的语法,一种是使用金仓的官方数据库迁移工具,先存入MYSQL数据库中,再迁移到金仓数据库。本文采用第二种方法。
- 修改数据库表名。部分表名在金仓数据库中会有冲突,需修改表名
| 原表名 | 修改表名 |
|---|---|
| sys_config | sys_con |
| sys_role | sys_role_info |
| sys_user | sys_user_info |
- 使用全局搜索修改
xml文件中涉及以上表名的部分



- 数据迁移。打开金仓数据迁移工具,相对位置在
Kingbase\ES\V9\ClientTools\guitools\KDts\KDTS-WEB\bin;初始账号和密码分别是账号kingbase密码Kb_DI@2019。具体用法参考文末链接。



修改驱动配置
安装金仓数据库依赖,修改相关配置
- 在pom安装依赖
<properties>
<kingbase.version>9.0.0</kingbase.version>
</properties>
<!--人大金仓相关-->
<dependency>
<groupId>cn.com.kingbase</groupId>
<artifactId>kingbase8</artifactId>
<version>${kingbase.version}</version>
</dependency>
- 修改
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语句
- 修改无法兼容金仓数据库的
sql语句,同样采用全局搜索相关的需要修改的文件
| 搜索 | 原sql示例 | 修改后sql |
|---|---|---|
| sysdate | sysdate() | current_timestamp/now() |
| find_in_set | find_in_set(#{a}, b) | #{a} = ANY(string_to_array(b, ',')::bigint[]) 或 #{a} = ANY(string_to_array(b, ',')(无需转 bigint) |
| date_format | date_format(u.create_time,‘%Y%m%d’) >= date_format({params.beginTime},‘%Y%m%d’) | to_char(u.create_time, '%Y%m%d') >= to_char(to_date(#{params.beginTime}, 'yyyy-MM-dd'),'%Y%m%d' ) |
| concat | concat(‘%’, #{userName}, ‘%’) | ‘%’ || #{userName} || ‘%’ |




-
修改代码生成模块的
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 >= to_timestamp(#{params.beginTime}, 'YYYY-MM-DD')
</if>
<if test="params.endTime != null and params.endTime != ''">
AND stat.modification <= 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增强
5474

被折叠的 条评论
为什么被折叠?



