最近在开发的一个产品需要解决不同的数据源的同步问题。由于采用的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

# 安装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::Translatorperl -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:

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

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

说明书链接:

SQL-Translator-Manual

FlinkCDC系列01: SQL-DDL方言翻译器:SQL-Translator测试手记相关推荐

  1. sql ddl中key_SQL DDL:SQL Server中SQL DDL命令入门

    sql ddl中key This article explains SQL DDL commands in Microsoft SQL Server using a few simple exampl ...

  2. Debezium系列之:使用Debezium接入SQL Server数据库数据到Kafka集群的详细技术文档

    Debezium系列之:使用Debezium接入SQL Server数据库数据到Kafka集群的详细技术文档 一.Debezium概述 二.SQL Server 连接器的工作原理 1.Snapshot ...

  3. SQL Server 2008中SQL应用系列及BI学习笔记系列--目录索引 @邀月

    邀月 的数据库学习 http://www.cnblogs.com/downmoon/archive/2011/03/10/1980172.html SQL Server 2008中SQL应用系列及BI ...

  4. 在Hive中执行DDL之类的SQL语句时遇到的一个问题

    在Hive中执行DDL之类的SQL语句时遇到的一个问题 作者:天齐 遇到的问题如下: hive> create table ehr_base(id string); FAILED: Execut ...

  5. hibernate 根据方言生成sql

    目录 hibernate 根据方言生成sql 建表语句生成 解析列属性 列类型 方言选择 hibernate 根据方言生成sql 建表语句生成 SchemaManagementToolCoordina ...

  6. 在Oracle中不通过存储过程一次执行多条SQL语句Oracle PL/SQL

    PL/SQL是ORACLE对标准数据库语言的扩展,ORACLE公司已经将PL/SQL整合到ORACLE 服务器和其他工具中了,近几年中更多的开发人员和DBA开始使用PL/SQL,本文将讲述PL/SQL ...

  7. sql语句优化之SQL Server

    MS   SQL   Server查询优化方法 查询速度慢的原因很多,常见如下几种 1.没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷)          2.I/O吞吐量小,形成 ...

  8. SQL COOKLIST:写SQL中的习惯语法暗坑

    O'REILLY有若干以"COOKBOOK"命名的"动物书",讲的是写一些语言代码时被称作"语法糖"的黑科技."语法糖" ...

  9. 方言听不懂,手把手教你用 Milvus 搭建方言翻译器!

    坐在上海的公交车上,我有时会遇到这样的烦恼:稍一分神,没能听见普通话报站,支棱起耳朵,却听不懂沪语报站.为了解决这个问题,我决定--学习沪语?No, 作为一名数据工程师,我索性搭建了一个方言翻译器,帮 ...

最新文章

  1. 单元格内多个姓名拆分成一列_EXCEL拆分单元格中的姓名,这都不叫事儿
  2. js在页面滚动到一定位置时触发事件?
  3. JQ_Web Uploader图片上传控件
  4. 初学者怎样看懂python代码_Python零基础入门-(如何让人读懂你的代码)文档注释
  5. 黑色全屏个人主页bootstrap4模板
  6. 批次程序安裝手冊寫法
  7. Js中函数式编程的理解
  8. php微信个性化菜单,微信公众平台新增个性化菜单接口,实现公众号
  9. PostgreSQL Pattern Matching
  10. 如果一个国家是一种颜色,中国的颜色美哭了!
  11. hdu 1497(图书管理系统模拟)
  12. Hadoop-熟悉常用的HDFS操作
  13. c# gerber文件读取_Gerber文件查看方法
  14. 随机数公式Random
  15. Android中的动画2(逐帧动画)
  16. LeetCode——字节跳动系列题目
  17. 测试开发工程师的发展
  18. 我不喜欢代码,却为何坚持做程序员?
  19. 中文字符 简体繁体相互转换
  20. 【堆】leetcode378.有序矩阵中第K小的元素

热门文章

  1. 新闻舆情管理平台开发,监控舆情发展趋势
  2. Linux根目录被删,后果不堪设想,如何防止这种情况的发生
  3. 圆通快递回应内鬼泄露用户信息:严打数据倒卖灰色产业
  4. XTransfer欧美本地账户可以收哪些地区的币种?
  5. 发展靠扩大人力规模,而不是技术研发创新,国内软件行业如何破局?
  6. 1.2 绝对误差、相对误差与有效数字
  7. 中专一年级学计算机吗,中专一年级计算机专业语文试卷.doc
  8. 手机怎么在线图片转文字?方法很简单快来看一看
  9. HTML5期末大作业:关于旅游网站设计----- 洪江市旅游网 HTML+CSS+JavaScript
  10. java毕业设计——基于java+J2EE+jsp的企业电子投票系统设计与实现(毕业论文+程序源码)——电子投票系统