最近在开发的一个产品需要解决不同的数据源的同步问题。由于采用的FlinkCDC读取然后JDBC同步的技术,该技术需要在本地的Sink数据源事先把表建立好。这个过程如何自动化很令人苦恼。
也考虑过其他的方案,比如simple-ddl-parser先解析ddl语句然后自己实现一个把解析过的结构化的SQL指令在输出成sql语句的方案,但是考虑到项目工期比较赶加上自身的yacc+lex方面造诣也不足够,只能考虑现成的方案。
Github: simple-ddl-parser
比如找到的这个Perl写的SQL::Translator, 一个用Perl语言写的解析几种SQL方言中DDL语句的包,并且提供了翻译功能。
这是一个用Perl编写,并上传到CPAN的包,因此需要先安装CPAN
# 安装SQL::Translator 必须安装cpanm
# 系统自带的Perl无法满足要求
wget https://raw.githubusercontent.com/miyagawa/cpanminus/master/cpanm
# mac directory
cp cpanm /usr/local/bin
chmod +x /usr/local/bin/cpanm
# install modules
cpanm SQL::Translator
perl -MCPAN -e shell
install SQL::Translator
# 调用
cd /Users/myuser/Programming/Perl/SQL-Translator-1.62/script
./sqlt -f MySQL -t Oracle ../examples/mysql_0_ddl_create.sql > ../examples/mysql_0_ddl_create_to_oracle.sql
案例一:
原始的SQL语句:
CREATE TABLE t_table_records (
id VARCHAR ( 255 ) NOT NULL,
create_time datetime DEFAULT CURRENT_TIMESTAMP NOT NULL,
creator VARCHAR ( 32 ) DEFAULT 'sys' NOT NULL,
current_rows BIGINT,
edit_time datetime DEFAULT CURRENT_TIMESTAMP NOT NULL,
editor VARCHAR ( 32 ) DEFAULT 'sys' NOT NULL,
managed_database_database VARCHAR ( 255 ) NOT NULL,
managed_database_schema VARCHAR ( 255 ),
managed_database_table VARCHAR ( 255 ) NOT NULL,
source_database_database VARCHAR ( 255 ) NOT NULL,
source_database_jdbc VARCHAR ( 255 ) NOT NULL,
source_database_schema VARCHAR ( 255 ),
source_database_table VARCHAR ( 255 ) NOT NULL,
source_database_type VARCHAR ( 255 ) NOT NULL,
source_rows BIGINT,
PRIMARY KEY ( id )
) ENGINE = INNODB DEFAULT CHARSET = utf8mb4 COMMENT = '导入元数据管理';
翻译过的Oracle语句
--
-- Created by SQL::Translator::Producer::Oracle
-- Created on Wed Jul 27 10:51:19 2022
--
-- We assume that default NLS_DATE_FORMAT has been changed
-- but we set it here anyway to be self-consistent.
ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS';
--
-- Table: t_table_records
--;
CREATE TABLE "t_table_records" (
"id" varchar2(255) NOT NULL,
"create_time" date DEFAULT CURRENT_TIMESTAMP NOT NULL,
"creator" varchar2(32) DEFAULT 'sys' NOT NULL,
"current_rows" number(20),
"edit_time" date DEFAULT CURRENT_TIMESTAMP NOT NULL,
"editor" varchar2(32) DEFAULT 'sys' NOT NULL,
"managed_database_database" varchar2(255) NOT NULL,
"managed_database_schema" varchar2(255),
"managed_database_table" varchar2(255) NOT NULL,
"source_database_database" varchar2(255) NOT NULL,
"source_database_jdbc" varchar2(255) NOT NULL,
"source_database_schema" varchar2(255),
"source_database_table" varchar2(255) NOT NULL,
"source_database_type" varchar2(255) NOT NULL,
"source_rows" number(20),
PRIMARY KEY ("id")
)
;
案例二:
原始的PostgreSQL语句
create table t_application (
id varchar(64) not null,
app_name varchar(255) null,
app_identifier varchar(255) null,
create_time TIMESTAMP null,
update_time timestamp null,
create_user varchar(64) null,
create_dept varchar(64) null,
is_delete INT2 null default 0,
constraint PK_T_APPLICATION primary key (id)
);
翻译过的语句
--
-- Created by SQL::Translator::Producer::MySQL
-- Created on Wed Jul 27 13:43:14 2022
--
SET foreign_key_checks=0;
--
-- Table: `t_application`
--
CREATE TABLE `t_application` (
`id` varchar(64) NOT NULL comment 'Ö÷¼ü',
`app_name` varchar(255) NULL DEFAULT NULL comment 'ϵͳÃû³Æ',
`app_identifier` varchar(255) NULL DEFAULT NULL comment 'ϵͳ±êʶ',
`create_time` timestamp NULL DEFAULT NULL comment '´´½¨Ê±¼ä',
`update_time` timestamp NULL DEFAULT NULL comment '¸üÐÂʱ¼ä',
`create_user` varchar(64) NULL DEFAULT NULL comment '´´½¨ÈË',
`create_dept` varchar(64) NULL DEFAULT NULL comment '´´½¨²¿ÃÅ',
`is_delete` integer(5) NULL DEFAULT 0 comment 'ÊÇ·ñɾ³ý',
PRIMARY KEY (`id`)
);
SET foreign_key_checks=1;
目前的BUG:
扫描二维码关注公众号,回复:
15290576 查看本文章
1. 如果第一条语句就是alter table add ...,则会识别错误。
2. 如果语句中包含的导出SQL语句生成的注释信息,则会报错无法识别(软件导出的PGSQL语句默认带注释,无法识别
说明书链接: