【国产化信创实践】PostgreSQL数据库替换涉及内容及常见问题

1.修改pom文件,添加PostgreSQL数据库依赖

 

<dependency>

    <groupId>org.postgresql</groupId>

    <artifactId>postgresql</artifactId>

    <version>42.2.19</version>

</dependency>

2.修改yml文件,添加PostgreSQL数据库连接

 

spring:

  datasource:

    driver-class-name: org.postgresql.Driver

    url: jdbc:postgresql://IP地址:5432/postgres_test

    username: 账号

    password: 密码

注意

1.用navicat连接postgres时,建议使用navicat 15,navicat 12将无法看见数据表

2.PostgreSQL对表名、字段名区分大小写;但是sql语句不区分大小写,大写会自动转小;如果要查询含有大写字母的表或者列时,使用双引号"":select "ID" from dic_user;

3.常用方法、函数较MySQL不同

  • group_count()

pg:方法一:string_agg()

 

例:SELECT string_agg(name,';') from sql_user_test GROUP BY age;

方法二:array_to_string(ARRAY_AGG() ,':')

例:select array_to_string(ARRAY_AGG(NAME) ,':'from sql_user_test GROUP BY age;

方法三:自定义group_count()函数,不推荐使用,效率没有string_agg()高

CREATE AGGREGATE GROUP_CONCAT(anyelement)

(

    sfunc=array_append,

    stype=anyarray,

    initcond='{}'

);

  • 正则匹配:REGEXP

pg:在pg使用正则表达式的时候需要使用关键字 “~”,若匹配规则不区分大小写,可以使用 “~*”,不匹配这个表达式则使用 “!~”,若表达式包含转义符,则需要在表达式前面添加关键字 ”E“。

例:SELECT from sql_user_test where name !~ '^l';

    SELECT from sql_user_test where code ~* '^L';

  • 起始日期加上一个时间段:DATE_ADD(d,INTERVAL expr unit)

pg:±

例:SELECT birthday,birthday + INTERVAL '1 YEAR' as newbirthday from sql_user_test order by id ;

    SELECT birthday,birthday - INTERVAL '1 year 1 day' as newbirthday from sql_user_test order by id ;

  • 计算d1,d2之间相隔的天数 DATEDIFF(d1,d2)

pg:- 或者age(),推荐使用 '-',age()将会返回INTERVAL类型数据,使用‘-’时,如果含有非date类型字段,返回值也将为interval类型

例:SELECT now()::date-birthday from sql_user_test order by id ; 

    SELECT age(regtime, birthday) from sql_user_test order by id; -- 419 years 11 mons 24 days

  • 日期转字符串DATE_FORMAT()

pg:to_char()

例:SELECT to_char( now(),'yyyy-mm-dd');  -- 2021-07-21

  • 字符串转日期 STR_TO_DATE()

pg:TO_DATE()

 展开原码

  • ifnull()

pg:coalesce()

 折叠原码

例:SELECT coalesce(null,4); --4

  • if(expr,v1,v2)

pg:不支持if,可以使用case when替代

  • uuid()

pg:默认不支持uuid()函数,解决办法如下

解决办法一:自定义uuid()函数

create or replace function uuid()

returns text as

$body$

    select array_to_string(array(SELECT substring('0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopgrstuvwxyz' from (ceil (random()*62))::int for 1) from generate_series(1, 32)),'');

$body$

language sql volatile;

解决办法二:

    linux环境下:

        从安装目录下share/contrib下找uuid-ossp.sql导入即可。

    windows环境下:

       1.开始菜单——PostgreSQL——SQL Shell,打开命令行客户端;

       2.根据提示依次输入数据库服务器地址、数据库名称、端口号、用户名、密码;

       3.执行命令 create extension "uuid-ossp",安装uuid_generate_v4()扩展函数;

       4.执行命令 select uuid_generate_v4(),如果返回uuid则成功

  • format()

pg:round()

例:SELECT round(10/3::numeric,2); -- 3.33

  • 除法 /

pg::如果是int类型的相除会取整,则需要转换

例:SELECT round(10/3::numeric,2); -- 3.33

4.项目中mysql替换pg写法

1. CONVERT ( CONCAT( YEAR (xxx ), '' ), SIGNED ) 或者 CONVERT ( DATE_FORMAT( a.cysj , '%Y%m' ), SIGNED )

替换:to_char(xxx,'yyyy')::int4  或者 to_number(to_char(birthday,'yyyyMM'),'999999')

2. format( ifnull( aa.zySsChoiceRate, 0 )/ zz.zySsChoiceRate * 100, 2 )

替换:round(coalesce(aa.zySsChoiceRate,0)/zz.zySsChoiceRate*100,2)  

注意:如果/前后都为int类型,/后也会为int型,需要转换类型

       round(coalesce(aa.zySsChoiceRate,0)/zz.zySsChoiceRate::decimal*100,2)

3.YEAR(z.cysj)

替换:to_char(z.cysj,'yyyy')

4.now()

替换:now()::timestamp(0)     pgsql:now()默认是时间戳

5.DATE_FORMAT( DATE_SUB( now(), INTERVAL 1 DAY ), '%Y%m%d' )

替换:to_char( now()+ INTERVAL '1 DAY ''yyyyMMdd' )

5.对于MySQL数据库自增id,如果pg数据库表已经创建如何修改id为自增

  1. 第一步需要创建一个序列:一般序列命名由表名+主键字段+seq组成,如下表名为monitor,主键字段为id:

    创建序列语句如下:

    create SEQUENCE monitor_id_seq
    START WITH 1
    INCREMENT BY 1
    NO MINVALUE
    NO MAXVALUE
    CACHE 1;

  2. 设置表字段自增sql
    ALTER table monitor alter column id set default nextval('monitor_id_seq'::regclass);

5.PG数据库替换mysql常见问题及对策

序号问题原因解决方案备注
1对于MySQL数据库自增id,如果pg数据库表已经创建如何修改id为自增已创建好的pg表无法直接通过表设计来修改主键为自增字段第一步需要创建一个序列:一般序列命名由表名+主键字段+seq组成,如下表名为monitor,主键字段为id:

创建序列语句如下:
create SEQUENCE monitor_id_seq
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;

设置表字段自增sql
ALTER table monitor alter column id set default nextval('monitor_id_seq'::regclass);
2如果pg数据库表id为自增且已有部分从1开始的数据,新增数据出现主键冲突问题新增数据id会从1开始递增,但已有id为1的数据,新增则报错把当前最大id当做id的自增起始数,使用如下sql:

select setval('your_table_id_seq',(select max(id) from 表名))

替换your_table和表名为自己需要更改的表

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
信创数据库迁移sql自动化测试是一种用于测试数据库迁移的自动化技术。在进行数据库迁移时,我们通常需要确保原数据库中的数据能够正确地迁移到目标数据库中,而不会出现数据丢失、数据格式错误或数据不一致等问题。为了保证数据库迁移的质量和效率,我们可以使用sql自动化测试来进行验证。 首先,sql自动化测试需要准备一组测试数据和测试脚本。测试数据应包括原数据库中的各种数据类型和数据结构,以及可能会用到的各种数据情况。测试脚本则是一系列的sql语句,用于在目标数据库中执行迁移操作。 其次,sql自动化测试需要搭建一个测试环境。这个环境应包括原数据库和目标数据库,并确保两个数据库之间的连接和访问正常。同时,还需要安装和配置自动化测试工具,用于执行测试脚本和生成测试报告。 然后,sql自动化测试可以进行数据迁移的验证。测试工具会自动执行测试脚本,并比对目标数据库中的数据与期望结果是否一致。如果存在差异,测试工具会记录错误信息,并生成测试报告,以供开发人员进行问题分析和修复。 最后,sql自动化测试还可以进行性能测试和负载测试。通过模拟多个并发用户同时进行数据库迁移操作,测试工具可以评估数据库在高负载情况下的性能和稳定性。 总之,信创数据库迁移sql自动化测试是一种高效、准确和可靠的测试方法,可以帮助我们验证数据库迁移的正确性和可靠性,并确保迁移过程不会对原有数据造成损失或变形。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

0海滨小城0

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值