掌桥专利:专业的专利平台
掌桥专利
首页

一种数据库间的SQL语句语法迁移方法及系统

文献发布时间:2023-06-19 10:54:12


一种数据库间的SQL语句语法迁移方法及系统

技术领域

本发明公开一种数据库间的SQL语句语法迁移方法及系统,涉及数据库处理技术领域。

背景技术

Sql语言是进行数据库查询的语言,目前SQL语言已有国际标准,成为定义和操作关系数据库名义上和实际上的标准。但不同的数据库厂商对SQL标准有着不同的实现,同时,不同的厂商也会实现一些SQL标准不支持的便利以及复杂的功能。用户在更改数据库产品时,往往需要付出较大的学习成本,这促进了语法迁移工具的产生。

从本质上讲,所有Sql语句在经过语法分析后生成的抽象语法树应该是相似或者相近的。传统的迁移工具开发需要处理分析输入语句,将其一一分解,将分解得到的单元进行重组得到新的输出语句,或者直接在原语句经过语法分析得到的AST树进行结构改变,生成新的树结构再进行遍历,进而得到输出语句。这种方式需要对迁移语句单个进行处理。由于每个需要迁移的语句都需要单独的处理过程,开发该部分代码尤其是多种数据库之间的语法迁移时,成本过于昂贵,同时限制了可扩展性。当迁移的数据库语法发生变化时,语法迁移的代码就需要进行重构,大大降低了迁移工具的可维护性。另一方面,当需要进行新的数据库语法迁移时,需要重新进行上述工作,这限制了之后数据库的可扩展性。

故现发明一种数据库间的SQL语句语法迁移方法及系统,以解决上述问题。

发明内容

本发明针对现有技术的问题,提供一种数据库间的SQL语句语法迁移方法及系统,所采用的技术方案为:一种数据库间的SQL语句语法迁移方法,所述的方法具体步骤包括:

S1对sql语句进行语法分析产生抽象语法树;

S2对抽象语法树进行重构的规则进行提取;

S3编写规则自动的生成树结构转换的代码;

S4调用生成代码对不同数据库间的sql语句进行转换。

所述S2对抽象语法树进行重构的规则进行提取的具体步骤包括:

S201对抽象语法树的转换规则进行提取得到树结构变换的基本规则;

S202对树结构重构转换的规则进行编写。

所述S201中的基本规则定义为转化为抽象语法树并可以被antlr4识别的规则语法。

所述S4中的语句开发转换为规则的编写,所述规则与S2中的语法规则一致。

一种数据库间的SQL语句语法迁移系统,所述的系统具体包括语法分析模块、规则提取模块、代码编写模块和语句转换模块:

语法分析模块:对sql语句进行语法分析产生抽象语法树;

规则提取模块:对抽象语法树进行重构的规则进行提取;

代码编写模块:编写规则自动的生成树结构转换的代码;

语句转换模块:调用生成代码对不同数据库间的sql语句进行转换。

所述规则提取模块具体包括:

第一提取模块:对抽象语法树的转换规则进行提取得到树结构变换的基本规则;

第二提取模块:对树结构重构转换的规则进行编写。

所述第二提取模块中的基本规则定义为转化为抽象语法树并可以被antlr4识别的规则语法。

所述语句转换模块的语句开发转换为规则的编写,所述规则与规则提取模块中的语法规则一致。

本发明的有益效果为:传统方式往往需要对两种数据库语法不同部分进行单独的处理,人为进行代码开发,本发明使用的方法转化为对树结构转换规则的提取,自动地生成树结构转换代码,开发方式更加简便,能够降低生产成本;

将代码的开发设计转换为规则的提取设计,提高了项目面临多种数据库时开发迁移工具的可扩展性。当需要进行新的语法迁移工具开发时,只需要进行规则的提取,除此之外的规则语法,生成代码等部分均可以直接复用,大大提高了迁移工具的扩展性能;

当一些数据库的某些语句发生变化时,可以直接修改其对应的树结构的规则文件,更改规则文件并直接生成代码。这种方式比起传统方式更加简便直接,并且不用担心修改部分与其他的模块相耦合,便于维护扩充。

附图说明

为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作一简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。

图1是本发明方法的流程图;图2是本发明系统的结构示意图;图3是本发明实施例的语句转换流程图。

具体实施方式

下面结合附图和具体实施例对本发明作进一步说明,以使本领域的技术人员可以更好地理解本发明并能予以实施,但所举实施例不作为对本发明的限定。

实施例一:

一种数据库间的SQL语句语法迁移方法,所述的方法具体步骤包括:

S1对sql语句进行语法分析产生抽象语法树;

S2对抽象语法树进行重构的规则进行提取;

S3编写规则自动的生成树结构转换的代码;

S4调用生成代码对不同数据库间的sql语句进行转换;

使用本发明方法时,抽象提取出对sql语句经过语法分析产生的抽象语法树进行重构的规则,编写规则自动的生成树结构转换的代码,调用生成代码可以直接完成不同数据库语句的语法转换工作;

进一步的,所述S2对抽象语法树进行重构的规则进行提取的具体步骤包括:

S201对抽象语法树的转换规则进行提取得到树结构变换的基本规则;

S202对树结构重构转换的规则进行编写;

通过对经过语法分析得到的抽象语法树的转换规则进行提取,得到一些树结构变换的基本规则,如增加树节点,删除树节点,节点属性变化等,后续的开发工作转换为树结构重构转换的规则编写;

进一步的,所述S201中的基本规则定义为转化为抽象语法树并可以被antlr4识别的规则语法;

自定义了一种能转换为抽象语法树并可以被antlr4识别的规则语法,该规则语法代表树结构变化的基本操作;

再进一步的,所述S4中的语句开发转换为规则的编写,所述规则与S2中的语法规则一致;

语法转换工具的开发转换为规则的编写,该规则是开发者在S2中定义的自定义规则,而非使用原本开发语言如java手动对树结构进行改变;

用户在编写规则后,可以根据编写的规则,来自动的生成出相应的树结构转换的程序代码。

实施例二:

一种数据库间的SQL语句语法迁移系统,所述的系统具体包括语法分析模块、规则提取模块、代码编写模块和语句转换模块:

语法分析模块:对sql语句进行语法分析产生抽象语法树;

规则提取模块:对抽象语法树进行重构的规则进行提取;

代码编写模块:编写规则自动的生成树结构转换的代码;

语句转换模块:调用生成代码对不同数据库间的sql语句进行转换。

进一步的,所述规则提取模块具体包括第一提取模块和第二提取模块:

第一提取模块:对抽象语法树的转换规则进行提取得到树结构变换的基本规则;

第二提取模块:对树结构重构转换的规则进行编写;

进一步的,所述第二提取模块中的基本规则定义为转化为抽象语法树并可以被antlr4识别的规则语法;

进一步的,所述语句转换模块的语句开发转换为规则的编写,所述规则与规则提取模块中的语法规则一致;

本发明提供一种数据库间的SQL语句语法迁移方法及系统,在不同数据库之间开发sql语法迁移转换工具的方法,以antlr4语法分析工具,构造出一种在多种sql语言之间的翻译器,抽象出简单的规则,用户只需编写规则便能够进行语法迁移工具的设计,自动生成语法迁移代码,而不需要对编译器,以及对数据库事务有详尽的了解,简化降低开发成本;

方案优选地,使用antlr4作为解析和处理sql语法的工具。Antlr4是一个强大的不同语言之间的语法解析器,可以用来读取、处理、执行或翻译结构化文本或二进制文件。它被广泛用来构建语言,工具和框架,对于两种不同的数据库,根据不同的数据库的语法文件,便可以使用antlr4进行语法的检查与处理;

方案优选地,使用Listener遍历机制。Antlr4有两种树遍历机制Listener和Visitor,可以从语法上来生成一个可以构建和遍历解析树的解析器;Listener通过DFS算法遍历整个树,用户可以在任意节点自定义响应函数。

Antlr4可以根据语法以及输入的语句生成相应的抽象语法树(Abstract SyntaxTree,AST),并在遍历语法树时对树的节点进行转换,变更树的结构。一般翻译器直接进行树的节点转换,常使用在不同语言之间。但是sql语言则是由于sql标准被不同数据库厂商的实现方式不同,同时,不同的数据库厂商有些更方便用户使用的,不属于sql标准的语法。像传统方式进行实现过于冗余复杂,且缺乏可扩展性。迁移代码需要对不同的语法理解深刻。本方法将节点转换的操作规则抽象提取出来,在此基础上进行语法的转换,自动生成该部分语法迁移代码;

抽象提取的一些基础操作规则有

MOVE移动当前节点到某节点

UPDATE更新当前节点的相关属性

NEWT生成新的Terminal Node

FINDUP从当前节点的祖先节点查找相关节点

FINDDOWN从当前节点的子孙节点查找相关节点

DELETE删除节点

ADD增加节点

引入模块ruler,包含操作的基本语法以及实现步骤。规则的语法用户可以自定义地实现,只需提供能够识别给定规则的语法即可;

引入compile,用于生成迁移代码;

引入类migrator,负责进行语法的转换,继承了antlr4的listener部分,重写了其中需要进行语法迁移的部分,该部分由compile生成;

用户自定义语法转换规则,调用compile,生成migrator代码。

Ruler模块为抽象规则的语法设计。用户可以自定义的设计相关的规则语法,如以下规则

该语句表示对当遍历AST树时,对遇到的PLUS节点进行移除,并向上查找WHERE节点进行移除,并将FROMC节点移动到该节点;

Compile部分会根据语法转换文件,读取转换规则并进行解析和转换。Compile读取后会对每种给定的规则进行解析,包括需要对哪种转换规则进行处理,以及进行处理的动作和顺序。然后根据这些信息生成migrator。migrator是一个antlr4的的listener,用户调用migrator对输入的sql语句进行遍历时可以对AST树进行结构上的改变,输出的AST就是转换后的sql语句。

以Oracle的SQL语句为例,Oracle的OUTER JOIN提供了(+)语法,如

SELECT empno,ename,job,dname,loc FROM emp,dept

WHERE emp.deptno=dept.deptno(+)

AND salary>50000

在没有实现了(+)语法的数据库中,该语句与下述语句等价

SELECT empno,ename,job,dname,loc

FROM emp LEFT OUTER JOIN dept ON emp.detno=dept.deptno

WHERE salary>50000

那么转换规则需要在处理OUTER JOIN语法时,在此节点向上查找WHERE节点,然后对WHERE节点的内容进行更改;通过编写以下规则

调用compile,以go语言为例,便可生成重载antlr4 Listener的代码部分如下

使用生成的Listener代码当对输入的带(+)语句进行遍历,便可以得到输出

SELECT empno,ename,job,dname,loc

FROM emp LEFT OUTER JOIN dept ON emp.detno=dept.deptno

WHERE salary>50000

最后应说明的是:以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。

相关技术
  • 一种数据库间的SQL语句语法迁移方法及系统
  • 一种在数据库间迁移数据的方法和系统
技术分类

06120112722702