Flyway不支持达梦
Flyway不支持达梦,如果想要Flyway支持达梦,需要创建达梦Database,就得对Flyway进行二次开发。
具体步骤可以参考:
blog.csdn.net/u012440725/…
MySQL与达梦不兼容的地方
MySQL与达梦数据库在语法和类型上存在不兼容的地方,在迁移的过程中发现如下问题:
MySQL在创建表的过程中指定了
ENGINE = InnoDB
DEFAULT CHARSET = utf8mb4
都需要把它去掉
MySQL在指定表名,字段名的时候,可以添加tablename
,columnname
,迁移到达梦数据库的时候需要把这个``去掉。
MySQL在创建表的过程中可以创建KEY,但是在达梦数据库里,需要使用CREATE INDEX语句创建。例如: MySQL原始语句:
CREATE TABLE `user`
`id` bigint NOT NULL,
`description` varchar(255) DEFAULT NULL,
`dept_id` bigint DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `FKoecs3fe5jj262ku2lnvncu2bg` (`dept_id`),
CONSTRAINT `FKoecs3fe5jj262ku2lnvncu2bg` FOREIGN KEY (`dept_id`) REFERENCES `dept` (`id`)
) ENGINE = InnoDB
DEFAULT CHARSET = utf8mb4;
上面的代码在达梦数据库里执行会报错,需要将SQL改为
CREATE TABLE user
id bigint NOT NULL,
description varchar(255) DEFAULT NULL,
dept_id bigint DEFAULT NULL,
PRIMARY KEY (id),
CONSTRAINT FKoecs3fe5jj262ku2lnvncu2bg FOREIGN KEY (dept_id) REFERENCES dept (id)
);
CREATE INDEX FKoecs3fe5jj262ku2lnvncu2bg ON user(dept_id);
MySQL在建表的时候创建UNIQUE INDEX,可以用UNIQUE KEY关键词来创建,但是达梦数据库不支持,可以通过两种方式来实现。例如 MySQL原始语句:
CREATE TABLE `dept`
`id` bigint NOT NULL,
`code` varchar(50) NOT NULL,
UNIQUE KEY `UK_khxe6t3tbtfjnn9b7piuiiedj` (`code`)
PRIMARY KEY (id)
) ENGINE = InnoDB
DEFAULT CHARSET = utf8mb4;
达梦创建unique index的语句如下: 第一种方式,在创建表的时候就可以创建unique index
CREATE TABLE dept
id bigint NOT NULL,
code varchar(50) NOT NULL,
constraint UK_khxe6t3tbtfjnn9b7piuiiedj unique(code)
PRIMARY KEY (id)
第二种方式,先建表在创建unique index
CREATE TABLE dept
id bigint NOT NULL,
code varchar(50) NOT NULL,
PRIMARY KEY (id)
CREATE UNIQUE INDEX UK_khxe6t3tbtfjnn9b7piuiiedj ON dept(code);
达梦在创建外键的时候,需要保证关联的表已经存在,例如上述3里的demo,在创建user表的时候指定了外键,关联了dept,就需要先保证dept这张表已经存在。
如果在执行达梦SQL的时候,SQL语句里带有关键词,可以给关键词加上双引号,不过最好建议改成非关键词。例如:
CREATE TABLE keywords
id bigint NOT NULL,
"COMMENT" text null,
PRIMARY KEY (id)
达梦数据库关键词可以参考:eco.dameng.com/document/dm…
MySQL创建表的时候,可以给update_time字段加上ON UPDATE CURRENT_TIMESTAMP,但是达梦不支持。例如: MySQL原始语句
CREATE TABLE IF NOT EXISTS `update_time_test`
`id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增主键',
`name` varchar(32) NOT NULL DEFAULT '' COMMENT 'schema名称',
`create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`creator` varchar(255) NOT NULL DEFAULT '' COMMENT '创建人id',
`last_modify_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后修改时间',
`status` int(4) unsigned DEFAULT '1' COMMENT '状态 0:草稿,1:正常',
`deleted` int(4) unsigned DEFAULT '0' COMMENT '删除状态 0:未删除,1:已删除',
PRIMARY KEY (`id`)
) ENGINE = InnoDB
DEFAULT CHARSET = utf8mb4;
达梦需要对应修改成:
CREATE TABLE IF NOT EXISTS update_time_test
id int NOT NULL AUTO_INCREMENT COMMENT '自增主键',
name varchar(32) NOT NULL DEFAULT '' COMMENT 'schema名称',
create_time datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
creator varchar(255) NOT NULL DEFAULT '' COMMENT '创建人id',
last_modify_time datetime DEFAULT CURRENT_TIMESTAMP COMMENT '最后修改时间',
status int DEFAULT '1' COMMENT '状态 0:草稿,1:正常',
deleted int DEFAULT '0' COMMENT '删除状态 0:未删除,1:已删除',
PRIMARY KEY (id)
IDP在MySQL数据库里有Hibernate_Sequence这张表,但是在达梦数据库里需要将表转化为sequence(也可以不手动转,在启动jpa的时候,会自动帮忙创建,看具体需求),语法如下:
create sequence hibernate_sequence start with 1 increment by 1
MySQL修改字段,使用change的语法跟达梦的不兼容,例如: 第一种:重命名字段
ALTER TABLE `tableA`
CHANGE colA colB VARCHAR(255) NULL;
对应的达梦SQL语句如下:
ALTER TABLE tableA rename column colA to colB;
ALTER TABLE tableA modify colB VARCHAR(255) NULL;
第二种:直接修改字段类型
ALTER TABLE tableB
CHANGE COLUMN colC colC VARCHAR(16) null;
对应的达梦SQL语句如下:
ALTER TABLE tableB
modify colC VARCHAR(16) null;
MySQL可以一条SQL删除多张表,达梦则需要一个个执行 MySQL原始语句
drop table tableA, tableB, tableC;
达梦需要对应修改成:
drop table tableA;
drop table tableB;
drop table tableC;
MySQL原始数据类型为bit(1),或者boolean,再插入值的时候,可以插入true, false。但是达梦只能插入1,0,其中1表示true,0表示false。例如: MySQL原始插入语句:
INSERT INTO `tableA` (`id`, `active`, `create_time`, `creator_id`, `deleted`, `level`,
`name`, `parent_id`,
`update_time`, `updated_by`)
VALUES (1, true, '2021-07-24 18:28:09.000000', 3, false, 1, '总部', 0, '2021-07-24 18:28:09.000000',
'admin'); -- active的值为true
达梦需要对应修改成:
INSERT INTO irm_department (id, active, create_time, creator_id, deleted, level, name, parent_id, update_time, updated_by) VALUES (1, 1, cast('2021-07-24 18:28:09' as datetime(6)), 3, 0, 1, '总部', 0,cast('2021-07-24 18:28:09' as datetime(6)), 'admin');
MySQL支持Replace Into语法,但达梦不支持,可以使用delete + insert的方式或者merge into的语法来实现。例如
MySQL原始语句
REPLACE INTO menu (id, bpid, code, icon, mpid, name, route, scene_type, target, top)
VALUES ('09060000', '09000000', 'testt', null, '09000000', 'test',
'test', '6,7', null, false);
达梦需要对应修改成:
delete from menu where id = '09060000';
INSERT
menu (id,
bpid,
code,
icon,
mpid,
name,
route,
scene_type,
target,
"TOP")
VALUES ('09060000',
'09000000',
'test',
null,
'09000000',
'test',
'test',
'6,7',
null,
数据类型不兼容
MySQL数据类型 | 达梦数据类型 | 备注 |
---|
longtext,text | clob | |
bit(1) | bit | 数字类型,MySQL bit类型可以指定长度,达梦不可以 |
int(11) | int | 数字类型,MySQL int类型可以指定长度,达梦不可以 |
longblob,mediumblob,tinyblob | blob | |
tinyint(1) | tinyint | 数字类型,MySQL tinyint类型可以指定长度,达梦不可以 |
| | |
| | |
MySQL在指定int类型的时候,还有指定是否有符号,unsigned,达梦则不需要指定,例如: MySQL原始语句
CREATE TABLE IF NOT EXISTS `tableB`
`id` int unsigned NOT NULL AUTO_INCREMENT COMMENT '自增主键',
`code` varchar(64) NOT NULL DEFAULT '',
`name` varchar(64) NOT NULL DEFAULT '',
`description` varchar(64) NOT NULL DEFAULT '',
`type` varchar(32) NOT NULL DEFAULT '',
PRIMARY KEY (`id`)
达梦需要对应修改成:
CREATE TABLE IF NOT EXISTS tableB
id int NOT NULL AUTO_INCREMENT COMMENT '自增主键',
code varchar(64) NOT NULL DEFAULT '',
name varchar(64) NOT NULL DEFAULT '',
description varchar(64) NOT NULL DEFAULT '',
type varchar(32) NOT NULL DEFAULT '',
PRIMARY KEY (id)
还有一些函数的区别,可以参考www.178syedu.com/docs/4d4ddc…
JPA整合达梦数据库
添加驱动包和达梦数据库的方言包 驱动包需要从达梦数据库的安装路径下获取,例如,我们已经将DM安装到了/dm8这个目录下,那么驱动包就在/dm8/drivers/jdbc目录下。 由于hibernate官方并没有支持达梦数据库的方言,所以也需要添加方言包,路径在/dm8/drivers/jdbc/dialect目录下。 我们数据库安装的版本是v8,所以对应驱动包就选择DmJdbcDriver18.jar。hibernate-core的版本是5.3.15.Final,所以对应的驱动包就选择DmDialect-for-hibernate5.3.jar。 将这两个jar上传到公司的maven的仓库里,供方便下载。 之后使用gradle,或者maven引用依赖,例如
damengVersion = '8.1.2.142'
hibernateVersion = '5.3.15.Final'
dmDialectHibernateVersion = '8.1.2.141'
springbootVersion = '2.5.4'
libs_damengConnector = [group: 'com.dameng', name: 'DmJdbcDriver8', version: damengVersion]
libs_hibernateCore = [group: 'org.hibernate', name: 'hibernate-core', version: hibernateVersion]
libs_dmDialectHibernate = [group: 'com.dameng', name: 'DmDialect-for-hibernate5.3', version: dmDialectHibernateVersion]
libs_springbootJpa = [group: 'org.springframework.boot', name: 'spring-boot-starter-data-jpa', version: springbootVersion]
libs_springbootWeb = [group: 'org.springframework.boot', name: 'spring-boot-starter-web', version: springbootVersion]
修改application.yaml。将driverClassName改成dm.jdbc.driver.DmDriver,方言选择 org.hibernate.dialect.DmDialect
spring:
datasource:
url: jdbc:dm://192.168.180.128:5236
username: shawn
password: shawn123456789
driver-class-name: dm.jdbc.driver.DmDriver
properties:
hibernate:
dialect: org.hibernate.dialect.DmDialect
show_sql: true
format_sql: true
default_schema: IDP
hibernate:
ddl-auto: update
entity里如果有关键词,执行jpa方法则会报错,有两种方式可以解决 第一种方式:使用@Column(name = ""comment""),加上双引号 第二种就是:使用@Column(name = "recode_comment"),将数据库里的字段comment改成recode_comment。
jpa可以通过@GeneratedValue注解来选择id生成的策略,默认是AUTO。如果是AUTO,就会默认使用数据库内部推荐的id生成策略。MySQL就只有auto_increment方式,但是达梦支持sequence和auto_increment两种方式,另外,sequence的优先级会更高,所以如果@GeneratedValue指定的AUTO,在达梦数据库里就会选择使用全局的SEQUENCE来生成id。 建议@GeneratedValue按照实际需求指定具体的生成策略。
最后,需要注意的是,建议使用安装达梦数据库下的Jdbc驱动包和方言包,可能兼容性比较差。旧版本的不一定能在新版本里运行。
会编程的机器人不会说
JavaScript
Node.js
- 1233
-
code2roc
Spring Boot
- 115.8w
-
JessYan
GitHub
Android