Mysql 迁移到 kingbase / PostGreSQL 数据库的项目改造细节

(一)背景

  • 公司最近要求国产化改造,需要把 mysql 数据迁移到 kingbase;
  • 由于项目架构是之前做C语言的人设计,所以很多表字段都存在直接使用驼峰式命名的情况,而不是我们所熟悉的下划线形式命名,这部分也需要改造;
  • 目前碰到了这些坑,整理了下发出来,希望能给后续有需要的人提供参考价值;
  • 后续会持续更新;

(二)应用以及版本

  • MybatisPlus(3.3.1)
  • kingbaseES(KingbaseES V008R006C007B0024 on aarch64-unknown-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (NeoKylin 4.8.5-36), 64-bit)

( Kingbase 是基于 PostGreSQL 开发的一款数据库,所以本篇文章也同样适用于 PostGre 改造 )

(三)创建和更新日志


【2023-05-16 创建】

1、修改 @TableName 注解统一修改表名为小写,有表名有驼峰命名的最好改为带下划线形式,对应数据库的表名一起修改;

-- 已知表命名为 t_device 的情况下,以下为错误实例:
1@TableName("T_DEVICE")
2@TableName("tDevice")
3@TableName("T_device")

2、检查实体类中的字段是否有非驼峰命名,驼峰命名不需要任何修改,最主要的是需要跟数据库中的字段保持对应,即带下划线的数据库表字段对应驼峰命名的实体类字段

--修改前的建表语句:
CREATE TABLE "public"."t_device" (
	"manualPath" varchar(64) COLLATE "pg_catalog"."default"
);
-- 修改前对应的实体类字段申明:
private String manualPath ;

-- 修改后的建表语句:
CREATE TABLE "public"."t_device" (
	"manualPath" varchar(64) COLLATE "pg_catalog"."default"
);

原理:(MybatisPlus 会自动将数据库中带下划线的字段转换成驼峰形式)

3、检查Mapper文件中的字段、函数(group by),类型转换,自行修改;

4、检索工程Wrapper修改条件字段名称与表字段对应,Wrapper中使用的字段,必须要和数据库保持一致,否则会报字段找不到的错误

5、数据库 bit 类型统一修改为int4

6、update 后面不能使用别名操作

修改前:update t_device t set t.band_flag = #{bandFlag} where t.id = #{id} ;
修改后:update t_device t set t.band_flag = #{bandFlag} where t.id = #{id} ;

7、对于表自增的 id,应当加上注解:@TableId(type = IdType.AUTO) ,不要使用 @TableId(type = IdType.NONE) 注解,否则 id 不会自增长

8、有使用 date_format 函数的 sql ,kingbase 没有这个函数,需要自定义,以下为参考,具体还需要结合业务看是否适配,可自行增减

-- 创建 date_format 函数,并支持若干日期格式
CREATE OR REPLACE FUNCTION "public"."date_format"("indate" anyelement, "intext" text)
    RETURNS "pg_catalog"."text" AS $BODY$
	BEGIN
		IF upper(inText) = upper('%Y%m%d_%H%i') THEN
		return to_char(inDate,'YYYYMMDD_HH24MI');
		END IF;
		IF upper(inText) = upper('%Y%m%d%H%i%s') THEN
		return to_char(inDate,'YYYYMMDDHH24MISS');
		END IF;
		IF upper(inText) = upper('%Y-%m-%d %H') THEN
		return to_char(inDate,'YYYY-MM-DD HH24');
		END IF;
		IF upper(inText) = upper('%Y-%m-%d') THEN
		return to_char(inDate,'YYYY-MM-DD');
		END IF;
		IF upper(inText) = upper('%Y-%m') THEN
		return to_char(inDate,'YYYY-MM');
		end if;
		IF upper(inText) = upper('%Y') THEN
		return to_char(inDate,'YYYY');
		end if;
		IF upper(inText) = upper('%m%d') THEN
		return to_char(inDate,'MMDD');
		END IF;
		IF upper(inText) = upper('%k') THEN
		return to_char(inDate,'HH24');
		END IF;
		IF upper(inText) = upper('%c') THEN
		return to_char(inDate,'MM');
		END IF;
		return '';
	END;
	$BODY$
LANGUAGE plpgsql VOLATILE
COST 100

9、关联表字段存在类型不一致的情况,需要用 :: varchar 做类型转换,因为 mysql 的语法对字符串和数值类型做了兼容处理,而 kingbase 是严格区分字符串和数值,所以在遇到一些类型不一致的情况,需要类型转换

-- 已知
SELECT * FROM t_alarm_history h 
	LEFT JOIN t_gis_config c on c.device_id=d.id or c.device_id :: varchar = CONCAT('cam_',d.id);

10、若该方法的返回类型为 resultMap ,则需要看情况修改该 resultMap 映射的 column 中的字段名;

11、若实体类中username字段没有按驼峰命名,需要在该字段上加上注解@TableField(“user_name”) 其他字段类似

12、凡是碰到 limit 关键字,需按照 postgre 语法重新更改

-- 对已知表查询前五条数据
修改前:limit 1,5
修改后:limit 0 offset 5

13、数据库表字段如果是char类型且长度大于1,如果存储的数据小于char类型长度,建议改为varchar


【2023-08-08 更新】

1、使用 @MapKey 注解的地方,需要将 key 统一为小写,金仓数据库查询出来无视大小写,统一会被自动转换成小写

sql 如下:

--【修改前】
SQL语句:select name as deviceName , id as deviceId from t_device 
java代码:Map deviceMap = (Map)deviceMap.get("deviceName");

--【修改后】
SQL语句:select name as devicename , id as deviceid from t_device 
java代码:Map deviceMap = (Map)deviceMap.get("devicename");

猜你喜欢

转载自blog.csdn.net/qq_23845083/article/details/130708295
今日推荐