当前位置:   article > 正文

FlinkCDC系列01: SQL-DDL方言翻译器:SQL-Translator测试手记_flink cdc ddl

flink cdc ddl

        最近在开发的一个产品需要解决不同的数据源的同步问题。由于采用的FlinkCDC读取然后JDBC同步的技术,该技术需要在本地的Sink数据源事先把表建立好。这个过程如何自动化很令人苦恼。
        也考虑过其他的方案,比如simple-ddl-parser先解析ddl语句然后自己实现一个把解析过的结构化的SQL指令在输出成sql语句的方案,但是考虑到项目工期比较赶加上自身的yacc+lex方面造诣也不足够,只能考虑现成的方案。

Github: simple-ddl-parser

        比如找到的这个Perl写的SQL::Translator, 一个用Perl语言写的解析几种SQL方言中DDL语句的包,并且提供了翻译功能。

SQL-Translator

这是一个用Perl编写,并上传到CPAN的包,因此需要先安装CPAN

  1. # 安装SQL::Translator 必须安装cpanm
  2. # 系统自带的Perl无法满足要求
  3. wget https://raw.githubusercontent.com/miyagawa/cpanminus/master/cpanm
  4. # mac directory
  5. cp cpanm /usr/local/bin
  6. chmod +x /usr/local/bin/cpanm
  7. # install modules
  8. cpanm SQL::Translator
  9. perl -MCPAN -e shell
  10. install SQL::Translator
  11. # 调用
  12. cd /Users/myuser/Programming/Perl/SQL-Translator-1.62/script
  13. ./sqlt -f MySQL -t Oracle ../examples/mysql_0_ddl_create.sql > ../examples/mysql_0_ddl_create_to_oracle.sql

案例一:

原始的SQL语句:

  1. CREATE TABLE t_table_records (
  2. id VARCHAR ( 255 ) NOT NULL,
  3. create_time datetime DEFAULT CURRENT_TIMESTAMP NOT NULL,
  4. creator VARCHAR ( 32 ) DEFAULT 'sys' NOT NULL,
  5. current_rows BIGINT,
  6. edit_time datetime DEFAULT CURRENT_TIMESTAMP NOT NULL,
  7. editor VARCHAR ( 32 ) DEFAULT 'sys' NOT NULL,
  8. managed_database_database VARCHAR ( 255 ) NOT NULL,
  9. managed_database_schema VARCHAR ( 255 ),
  10. managed_database_table VARCHAR ( 255 ) NOT NULL,
  11. source_database_database VARCHAR ( 255 ) NOT NULL,
  12. source_database_jdbc VARCHAR ( 255 ) NOT NULL,
  13. source_database_schema VARCHAR ( 255 ),
  14. source_database_table VARCHAR ( 255 ) NOT NULL,
  15. source_database_type VARCHAR ( 255 ) NOT NULL,
  16. source_rows BIGINT,
  17. PRIMARY KEY ( id )
  18. ) ENGINE = INNODB DEFAULT CHARSET = utf8mb4 COMMENT = '导入元数据管理';

翻译过的Oracle语句

  1. --
  2. -- Created by SQL::Translator::Producer::Oracle
  3. -- Created on Wed Jul 27 10:51:19 2022
  4. --
  5. -- We assume that default NLS_DATE_FORMAT has been changed
  6. -- but we set it here anyway to be self-consistent.
  7. ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS';
  8. --
  9. -- Table: t_table_records
  10. --;
  11. CREATE TABLE "t_table_records" (
  12. "id" varchar2(255) NOT NULL,
  13. "create_time" date DEFAULT CURRENT_TIMESTAMP NOT NULL,
  14. "creator" varchar2(32) DEFAULT 'sys' NOT NULL,
  15. "current_rows" number(20),
  16. "edit_time" date DEFAULT CURRENT_TIMESTAMP NOT NULL,
  17. "editor" varchar2(32) DEFAULT 'sys' NOT NULL,
  18. "managed_database_database" varchar2(255) NOT NULL,
  19. "managed_database_schema" varchar2(255),
  20. "managed_database_table" varchar2(255) NOT NULL,
  21. "source_database_database" varchar2(255) NOT NULL,
  22. "source_database_jdbc" varchar2(255) NOT NULL,
  23. "source_database_schema" varchar2(255),
  24. "source_database_table" varchar2(255) NOT NULL,
  25. "source_database_type" varchar2(255) NOT NULL,
  26. "source_rows" number(20),
  27. PRIMARY KEY ("id")
  28. )
  29. ;

案例二:

原始的PostgreSQL语句

  1. create table t_application (
  2. id varchar(64) not null,
  3. app_name varchar(255) null,
  4. app_identifier varchar(255) null,
  5. create_time TIMESTAMP null,
  6. update_time timestamp null,
  7. create_user varchar(64) null,
  8. create_dept varchar(64) null,
  9. is_delete INT2 null default 0,
  10. constraint PK_T_APPLICATION primary key (id)
  11. );

翻译过的语句

  1. --
  2. -- Created by SQL::Translator::Producer::MySQL
  3. -- Created on Wed Jul 27 13:43:14 2022
  4. --
  5. SET foreign_key_checks=0;
  6. --
  7. -- Table: `t_application`
  8. --
  9. CREATE TABLE `t_application` (
  10. `id` varchar(64) NOT NULL comment 'Ö÷¼ü',
  11. `app_name` varchar(255) NULL DEFAULT NULL comment 'ϵͳÃû³Æ',
  12. `app_identifier` varchar(255) NULL DEFAULT NULL comment 'ϵͳ±êʶ',
  13. `create_time` timestamp NULL DEFAULT NULL comment '´´½¨Ê±¼ä',
  14. `update_time` timestamp NULL DEFAULT NULL comment '¸üÐÂʱ¼ä',
  15. `create_user` varchar(64) NULL DEFAULT NULL comment '´´½¨ÈË',
  16. `create_dept` varchar(64) NULL DEFAULT NULL comment '´´½¨²¿ÃÅ',
  17. `is_delete` integer(5) NULL DEFAULT 0 comment 'ÊÇ·ñɾ³ý',
  18. PRIMARY KEY (`id`)
  19. );
  20. SET foreign_key_checks=1;

目前的BUG:

        1. 如果第一条语句就是alter table add ...,则会识别错误。

        2. 如果语句中包含的导出SQL语句生成的注释信息,则会报错无法识别(软件导出的PGSQL语句默认带注释,无法识别

说明书链接:

SQL-Translator-Manual

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/475535
推荐阅读
相关标签
  

闽ICP备14008679号