CN117555925B - 数据库访问代码转换方法、装置及电子设备 - Google Patents

数据库访问代码转换方法、装置及电子设备 Download PDF

Info

Publication number
CN117555925B
CN117555925B CN202410044913.7A CN202410044913A CN117555925B CN 117555925 B CN117555925 B CN 117555925B CN 202410044913 A CN202410044913 A CN 202410044913A CN 117555925 B CN117555925 B CN 117555925B
Authority
CN
China
Prior art keywords
code
converted
target
template
scala
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Active
Application number
CN202410044913.7A
Other languages
English (en)
Other versions
CN117555925A (zh
Inventor
秦元
马骋原
应雄
闫长虎
吴裕欣
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Hundsun Technologies Inc
Original Assignee
Hundsun Technologies Inc
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Hundsun Technologies Inc filed Critical Hundsun Technologies Inc
Priority to CN202410044913.7A priority Critical patent/CN117555925B/zh
Publication of CN117555925A publication Critical patent/CN117555925A/zh
Application granted granted Critical
Publication of CN117555925B publication Critical patent/CN117555925B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/20Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
    • G06F16/24Querying
    • G06F16/245Query processing
    • G06F16/2453Query optimisation
    • G06F16/24534Query rewriting; Transformation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/20Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
    • G06F16/24Querying
    • G06F16/242Query formulation
    • G06F16/2433Query languages
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/42Syntactic analysis
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/44Encoding
    • G06F8/447Target code generation
    • YGENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
    • Y02TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
    • Y02DCLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
    • Y02D10/00Energy efficient computing, e.g. low power processors, power management or thermal management

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Computational Linguistics (AREA)
  • Data Mining & Analysis (AREA)
  • Databases & Information Systems (AREA)
  • Software Systems (AREA)
  • Mathematical Physics (AREA)
  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)

Abstract

本申请提供一种数据库访问代码转换方法、装置及电子设备,涉及计算机领域。其中,电子设备接收待转换代码,其中,待转换代码为访问数据库的过程化SQL语言;解析待转换代码,生成待转换代码的抽象语法树;遍历抽象语法树,得到Spark平台下的Scala代码模板所需的元数据信息;将元数据信息写入Scala代码模板的空缺位置,得到与待转换代码功能相同的目标Scala代码。基于上述方法,将访问数据库的过程化SQL语言转换为Spark平台下与之功能相同的Scala脚本,从而使得Spark平台能够支持过程化SQL语言,提高了Spark平台数据处理的扩展能力。

Description

数据库访问代码转换方法、装置及电子设备
技术领域
本申请涉及计算机领域,具体而言,涉及一种数据库访问代码转换方法、装置及电子设备。
背景技术
过程化SQL语言(又名PL/SQL、过程式SQL)指结合了过程化编程语言和SQL查询语言特性的计算机语言,具有一次编译后多次调用的特点。通过程化SQL语言能够为开发人员提供一种在数据库层面上实现业务逻辑的方式,使开发人员能够更好地管理和控制数据。因此,在关系型数据库中会广泛通过过程化SQL语言进行数据处理、ETL(Extract-Transform-Load,抽取、清洗、转换、装载)、统计分析等业务场景,如在Oracle中PL/SQL存储过程的使用。
Apache Spark等计算引擎可以实现丰富的分布式计算的能力,但通常需要开发复杂的弹性分布式数据集(Resilient Distributed Dataset,简称:RDD)算子(以下简称为RDD算子)的脚本或者通过SparkSQL间接生成RDD算子的脚本。尽管SparkSQL简化了RDD算子的开发难度,但SparkSQL存在一定的局限性,即无法实现过程化SQL语言的能力。
发明内容
本申请的目的在于提供一种数据库访问代码转换方法、装置及电子设备,其能将访问数据库的过程化SQL语言转换为Spark平台下能够实现相同功能的Scala脚本,从而使得Spark平台能够支持过程化SQL语言这一特性。
为了实现上述目的,本申请实施例采用的技术方案如下:
第一方面,本申请提供一种数据库访问代码转换方法,所述方法包括:
接收待转换代码,其中,所述待转换代码为访问数据库的过程化SQL语言;
解析所述待转换代码,生成所述待转换代码的抽象语法树;
遍历所述抽象语法树,得到Spark平台下的Scala代码模板所需的元数据信息;
将所述元数据信息写入所述Scala代码模板的空缺位置,得到与所述待转换代码功能相同的目标Scala代码。
可选地,所述Scala代码模板包括与多种代码块一一对应的多个子模板,所述遍历所述抽象语法树,得到Spark平台下的Scala代码模板所需的元数据信息,包括:
对于从所述抽象语法树中遍历出的每个目标代码块,根据所述目标代码块的抽象语法树,获取与所述目标代码块相对应子模板所需的元数据信息。
可选地,所述根据所述目标代码块的抽象语法树,获取与所述目标代码块相对应子模板所需的元数据信息,包括:
判断所述目标代码块是否需要连接数据库;
若是,则从所述目标代码块的抽象语法树中获取数据源名称以及数据表操作信息,并根据所述数据源名称从数据源管理服务中得到数据源的连接配置信息;
将所述数据表操作信息与所述连接配置信息作为与所述目标代码块相对应子模板所需的元数据信息;
若否,则从所述目标代码块的抽象语法树中获取与所述目标代码块相对应的子模板所需的元数据信息。
可选地,所述解析所述待转换代码,生成所述待转换代码的抽象语法树,包括:
计算所述待转换代码的哈希值;
判断是否有以所述哈希值作为名称的历史编译结果;
若否,则解析所述待转换代码,生成所述待转换代码的抽象语法树,其中,所述历史编译结果表示历史待转换代码的编译结果。
可选地,所述方法还包括:
计算所述待转换代码的哈希值;
将所述待转换代码的哈希值作为所述目标Scala代码对应编译结果的名称。
可选地,所述解析所述待转换代码,生成所述待转换代码的抽象语法树,包括:
通过过程化SQL语言的解析器对所述待转换代码的词法以及语法进行分析,生成所述待转换代码的抽象语法树。
可选地,所述Scala代码模板中的需要填充的空缺位置通过占位符进行标记,所述将所述元数据信息写入所述Scala代码模板的预设位置,得到与所述待转换代码功能相同的目标Scala代码,包括:
调用模板引擎将所述元数据信息写入所述Scala代码模板中的占位符标记的位置,并将写入了元数据信息的Scala代码模板转换为所述目标Scala代码。
第二方面,本申请还提供一种数据库访问代码转换装置,所述装置包括:
代码接收模块,用于接收待转换代码,其中,所述待转换代码为访问数据库的过程化SQL语言;
代码解析模块,用于解析所述待转换代码,生成所述待转换代码的抽象语法树;
所述代码解析模块,还用于遍历所述抽象语法树,得到Spark平台下的Scala代码模板所需的元数据信息;
代码转换模块,用于将所述元数据信息写入所述Scala代码模板的空缺位置,得到与所述待转换代码功能相同的目标Scala代码。
可选地,所述Scala代码模板包括与多种代码块一一对应的多个子模板,所述代码解析模块还具体用于:
对于从所述抽象语法树中遍历出的每个目标代码块,根据所述目标代码块的抽象语法树,获取与所述目标代码块相对应子模板所需的元数据信息。
可选地,所述代码解析模块还具体用于:
判断所述目标代码块是否需要连接数据库;
若是,则从所述目标代码块的抽象语法树中获取数据源名称以及数据表操作信息,并根据所述数据源名称从数据源管理服务中得到数据源的连接配置信息;
将所述数据表操作信息与所述连接配置信息作为与所述目标代码块相对应子模板所需的元数据信息;
若否,则从所述目标代码块的抽象语法树中获取与所述目标代码块相对应的子模板所需的元数据信息。
可选地,所述代码解析模块还具体用于:
计算所述待转换代码的哈希值;
判断是否有以所述哈希值作为名称的历史编译结果;
若否,则解析所述待转换代码,生成所述待转换代码的抽象语法树,其中,所述历史编译结果表示历史待转换代码的编译结果。
可选地,所述代码转换模块还用于:
计算所述待转换代码的哈希值;
将所述待转换代码的哈希值作为所述目标Scala代码对应编译结果的名称。
可选地,所述代码解析模块还具体用于:
通过过程化SQL语言的解析器对所述待转换代码的词法以及语法进行分析,生成所述待转换代码的抽象语法树。
可选地,所述Scala代码模板中的需要填充的空缺位置通过占位符进行标记,所述代码转换模块还具体用于:
调用模板引擎将所述元数据信息写入所述Scala代码模板中的占位符标记的位置,并将写入了元数据信息的Scala代码模板转换为所述目标Scala代码。
第三方面,本申请还提供一种电子设备,包括:
存储器,用于存储一个或多个程序;
处理器;
当所述一个或多个程序被所述处理器执行时,实现所述的方法。
第四方面,本申请还提供一种计算机可读存储介质,其上存储有计算机程序,该计算机程序被处理器执行时实现所述的方法。
相对于现有技术而言,本申请提供一种数据库访问代码转换方法、装置及电子设备。其中,电子设备接收待转换代码,其中,待转换代码为访问数据库的过程化SQL语言;解析待转换代码,生成待转换代码的抽象语法树;遍历抽象语法树,得到Spark平台下的Scala代码模板所需的元数据信息;将元数据信息写入Scala代码模板的空缺位置,得到与待转换代码功能相同的目标Scala代码。基于上述方法,将访问数据库的过程化SQL语言转换为Spark平台下与之功能相同的Scala脚本,从而使得Spark平台能够支持过程化SQL语言,提高了Spark平台数据处理的扩展能力。
为使本申请的上述目的、特征和优点能更明显易懂,下文特举较佳实施例,并配合所附附图,作详细说明如下。
附图说明
为了更清楚地说明本申请实施例的技术方案,下面将对实施例中所需要使用的附图作简单地介绍,应当理解,以下附图仅示出了本申请的某些实施例,因此不应被看作是对范围的限定,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他相关的附图。
图1为本申请实施例提供的数据库访问代码转换方法的流程之一;
图2为本申请实施例提供的交互场景示意图;
图3为本申请实施例提供的数据库访问代码转换方法的流程之二;
图4为本申请实施例提供的连接数据库的代码块的转换原理示意图;
图5为本申请实施例提供的存储过程的转换原理示意图;
图6为本申请实施例提供的代码块与子模板对应关系示意图;
图7为本申请实施例提供的数据库访问代码转换装置的结构示意图;
图8为本申请实施例提供的电子设备的结构示意图。
具体实施方式
为使本申请实施例的目的、技术方案和优点更加清楚,下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本申请一部分实施例,而不是全部的实施例。通常在此处附图中描述和示出的本申请实施例的组件可以以各种不同的配置来布置和设计。
因此,以下对在附图中提供的本申请的实施例的详细描述并非旨在限制要求保护的本申请的范围,而是仅仅表示本申请的选定实施例。基于本申请中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。
应注意到:相似的标号和字母在下面的附图中表示类似项,因此,一旦某一项在一个附图中被定义,则在随后的附图中不需要对其进行进一步定义和解释。
在本申请的描述中,需要说明的是,术语“第一”、“第二”、“第三”等仅用于区分描述,而不能理解为指示或暗示相对重要性。此外,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
基于以上声明,鉴于本申请实施例涉及到大量的技术术语,为使接下来将要介绍的技术方案更易于理解,下面先对本实施例涉及到的技术术语进行解释说明。
(1)结构化查询语言(Structured Query Language,简称:SQL),是一种标准化的语言,使用户能够以声明式的方式描述所需的操作和查询,而不必关注具体的实现细节,用于管理和操作关系型数据库***。目前被广泛应用于数据库管理***中,用于创建、修改和查询数据库中的数据和结构。例如,支持Select语句、Insert语句、Update语句、Delete语句等。
(2)过程化SQL语言,结合了过程语言与SQL语言的特性。其中,过程语言的特征包括变量声明、条件判断、循环处理和异常处理等;SQL语言则用于对数据库进行操作和查询,其特性包括数据***、数据查询、数据更新、数据删除等。具体的,数据***通过Insert语句实现,数据查询通过Select语句实现,数据更新通过Update语句实现,数据删除通过Delete语句实现。由于过程化SQL语言结合了过程语言与SQL语言的特性,因此,可以通过过程化SQL语言编写既能执行复杂的数据处理、业务逻辑和数据操作,又能利用SQL语句进行数据的检索和更新的业务代码。
相比于纯SQL语言,过程化SQL语言具有更高的灵活性和功能性,因此,允许开发人员在数据库中编写更复杂的逻辑和算法,并封装为可重复使用的数据库访问对象,由数据库编译后,将编译结果存储在本地。开发人员只需在客户端编写调用过程化SQL语言的执行命令,数据库接收到执行命令后,在数据库内部完成整个过程化SQL语言的执行,并将最终的执行结果反馈给用户。
相较于通过多条SQL语句实现功能时,每条语句都需要在客户端和服务端传递,过程化SQL语言的调用在整个过程中网络里只传输了很少的数据,减少了网络传输以及反复编译的时间,所以整体程序的执行性能会有明显的提高。
(3)SparkSQL,是Apache Spark生态***中的一个组件,其解决了大规模数据处理中手写RDD算子的繁琐和复杂性。对此,首先应理解到的是,在Spark早期,使用RDD进行数据处理是主要的编程模型。RDD提供了一个强大的抽象,允许开发人员编写RDD算子以分布式方式对数据集进行操作。然而,手写RDD算子需要开发人员编写大量的代码来定义数据转换和操作,这导致了开发过程的繁琐和错误的可能性增加。而随着大数据应用的不断增长,数据处理的需求也变得更加复杂,传统的RDD算子编程模型对于复杂的数据分析和查询变得不够高效和灵活。
为了解决这个问题,Apache Spark提出了SparkSQL。在SparkSQL中引入了结构化数据处理的概念,提供了一种类似于传统数据库的SQL查询接口,SparkSQL内部会将开发人员编写的SQL查询语句转换为基于RDD的操作,从而充分利用Spark的分布式计算能力。因此,SparkSQL使开发人员可以使用标准的SQL语句来查询和分析数据,而无需手动编写复杂的RDD转换和操作。
(4)RDD算子是Spark的核心抽象,允许开发人员以分布式的方式对大规模数据集进行转换和操作。RDD算子分为两类:转换算子(Transformation)和动作算子(Action)。其中,转换算子接受一个RDD作为输入,并返回一个新的RDD作为输出,常见的转换算子包括Map、Filter、ReduceByKey等操作,它们允许开发人员对数据集进行各种转换、过滤和聚合操作。动作算子则触发RDD计算并返回结果给驱动程序,例如Count、Collect、Save等操作,它们用于触发实际的计算并获取结果。Scala是一种支持函数式编程的强类型编程语言,而Spark使用Scala作为主要的编程语言;因此,RDD算子的设计和接口与Scala语言的函数式编程风格一致,使得开发人员可以使用Scala语言的函数和闭包来定义RDD算子的逻辑,从而实现复杂的数据处理和转换操作。
(5)抽象语法树(Abstract Syntax Tree,简称:AST),是在编程语言编译器和解释器中常用的一种数据结构,用于表示源代码的语法结构。抽象语法树具体表现为一种树状结构,其中每个节点表示源代码的一个语法结构单元,如表达式、语句、函数等。节点之间的关系表示了语法结构之间的层次和关联关系;树的根节点代表整个程序,而叶节点代表最基本的语法单元。在编程语言中,源代码通常由一系列的词法单元组成,如关键字、标识符、运算符、常量等。编译器或解释器通过词法分析将源代码转换为词法单元的序列,然后通过语法分析将这些词法单元组织成一个抽象语法树。
(6)StringTemplate4,(简称ST4)是一种模板引擎,用于生成文本输出。其提供了灵活而强大的模板语言,使得开发人员可以将数据与模板进行结合,生成各种形式的文本输出,如代码生成、报告生成、HTML生成等。
结合上述相关技术术语的说明,正如背景技术中所介绍的,尽管SparkSQL简化了RDD算子的开发难度,但SparkSQL存在一定的局限性,即无法实现过程化SQL语言的能力。
基于上述技术问题的发现,发明人经过创造性劳动提出下述技术方案以解决或者改善上述问题。需要注意的是,以上现有技术中的方案所存在的缺陷,是发明人在经过实践并仔细研究后得出的结果,因此,上述问题的发现过程以及下文中本申请实施例针对上述问题所提出的解决方案,都应该是发明人在发明创造过程中对本申请做出的贡献,而不应当理解为本领域技术人员所公知的技术内容。
鉴于此,本实施例提供一种数据库访问代码转换方法,其核心思路在于:
电子设备接收待转换代码;解析待转换代码,生成待转换代码的抽象语法树;遍历抽象语法树,得到Spark平台下的Scala代码模板所需的元数据信息;将元数据信息写入Scala代码模板的空缺位置,得到与待转换代码功能相同的目标Scala代码。基于上述方法,将访问数据库的过程化SQL语言转换为Spark平台下与之功能相同的Scala脚本,从而使得Spark平台能够支持过程化SQL语言,提高了Spark平台数据处理的扩展能力。
其中,实施该方法的电子设备,可以但不限于:移动终端、平板计算机、膝上型计算机、台式计算机以及服务器等。
当其为服务器时,该服务器可以是单个服务器,也可以是服务器组。服务器组可以是集中式的,也可以是分布式的(例如,服务器可以是分布式***)。在一些实施例中,服务器相对于用户终端,可以是本地的、也可以是远程的。在一些实施例中,服务器可以在云平台上实现;仅作为示例,云平台可以包括私有云、公有云、混合云、社区云(CommunityCloud)、分布式云、跨云(Inter-Cloud)、多云(Multi-Cloud)等,或者它们的任意组合。在一些实施例中,服务器可以在具有一个或多个组件的电子设备上实现。
为使本实施例提供的方案更加清楚,下面假定该电子设备为服务器,并结合图1对该方法的各个步骤进行详细阐述。但应该理解,流程图的操作可以不按顺序实现,没有逻辑的上下文关系的步骤可以反转顺序或者同时实施。此外,本领域技术人员在本申请内容的指引下,可以向流程图添加一个或多个其他操作,也可以从流程图中移除一个或多个操作。如图1所示,该方法包括:
S11、接收待转换代码。
其中,待转换代码为访问数据库的过程化SQL语言。
示例性的,如图2所示,服务器11通过客户端12向用户提供一个交互界面13,该交互界面13中包括有文本输入框以及与文本框配套的“提交”按钮。开发人员可以通过该文本输入框输入符合过程化SQL语言语法特性的待转换代码;并在输入完成后,点击“提交”按钮,将输入的待转换代码发送给服务器11。
进而,服务器11接收客户端12发送待转换代码,并进行后续转换处理。当然,服务器11还可以通过其他方式接收待转换代码,本实施例对此不再进行赘述。例如,该客户端12还可以通过FTP协议将记录有待转换代码的文件发送给服务器11。
结合上述实施例对待转换代码的介绍,继续参见图1,本实施例提供的数据库访问代码转换方法,还包括:
S12、解析待转换代码,生成待转换代码的抽象语法树。
需要说明的是,为了能够将待转换代码转换为抽象语法树,该服务器可以通过过程化SQL语言的解析器对过程化SQL语言的词法以及语法进行分析,生成待转换代码的抽象语法树。
其中,词法分析是将待转换代码划分为一系列词法单元的过程。词法单元是待转换代码中的最小语法单元,如待转换代码中的关键字、标识符、运算符、常量等。
具体的,在词法分析过程中,服务器对待转换代码进行扫描,将字符序列转换为词法单元序列,并将每个词法单元与其对应的类别进行关联。而在语法分析过程中,服务器根据过程化SQL语言的文法规则,检查词法单元序列的组合方式,构建语法结构并生成抽象语法树。该抽象语法树反映了待转换代码的语法结构,每个节点代表一个语法结构单元,节点之间的关系表示层次和关联关系。
基于上述实施例中对抽象语法树的介绍,继续参见图1,本实施例提供的数据库访问代码转换方法,还包括:
S13、遍历抽象语法树,得到Spark平台下的Scala代码模板所需的元数据信息。
应理解的是,该Scala代码模板中通过Scala语言预先定义了主体功能逻辑的框架,但缺乏关键的元数据信息,缺乏的元数据信息在Scala代码模板中预留有空缺位置。因此,服务器需要从待转换代码中获取Scala代码模板所需的元数据信息并将其填充到Scala代码模板中的空缺位置,才能使模板具备完整的功能且符合Scala代码的语法。
S14、将元数据信息写入Scala代码模板的空缺位置,得到与待转换代码功能相同的目标Scala代码。
通过上述实施方式,使得Spark平台能够将满足过程化SQL语言语法的待转换代码,转换为能够在Spark平台运行且与待转换代码功能相同的目标Scala代码。对于复杂的数据处理、业务逻辑和数据操作,可利用本实施提供的Spark平台,直接编写符合过程化SQL语言的代码即可实现,从而通过上述计算机程序语言之间的转换,将关系型数据库支持的过程化SQL语言迁移到Spark平台,提高Spark平台数据处理的扩展能力。
在一种可能的实现方式中,将上述用于词法分析以及语法分析的解析器称为PL解析器,服务器调用内部的PL解析器实现对上述待转换代码的词语分析以及语法分析。其中,该PL解析器可以通过手动编写、解析器生成工具等方式获得。下面以解析器生成工具为例,对PL解析器的生成方式进行示例性说明。
需要说明的是,该解析器生成工具可以根据给定的词法和语法规则自动生成解析器代码,即开发人员提供过程化SQL语言的词法和语法规范,然后使用解析器生成器生成能够识别过程化SQL语言语法的PL解析器。该解析器生成工具可以但不限于:ANTLR(ANotherTool for Language Recognition)、Yacc(Yet Another Compiler Compiler)等。以ANTLR为例,在一种可能的实现方式中,可以通过以下步骤获得PL解析器:
(1)定义词法规则:创建一个扩展名为.g4的语法描述文件,并在该文本文件中编写过程化SQL语言的词法规则。具体需要在语法描述文件中定义词法单元的类型和模式。例如,定义过程化SQL语言中涉及到的关键字、标识符、运算符、常量等。
(2)定义语法规则:在上述语法描述文件中,还需要进一步定义过程化SQL语言的语法规则。在定义语法规则时,使用词法单元和其他语法规则来构建过程化SQL语言的语法结构的层次关系,包括表达式规则、语句规则、语法结构的层次关系等。
其中,该表达式规则,用于描述表达式可以由哪些元素组成、如何组合,并定义运算符的优先级和结合性,从而实现描述过程化SQL语言的计算、逻辑操作等。例如,通过表达式规则描述过程化SQL语言中的算术表达式,包括整数、加法和乘法操作符。
该语句规则,用于描述语句的语法规则,指定语句的结构和组成方式,从而表示执行特定操作或控制流程。例如,通过语法规则描述过程化SQL语言中的赋值语句、条件语句、循环语句和函数调用语句等语句规则。
该语法结构的层次关系,用于描述过程化SQL语言中不同语法元素之间的组织方式和嵌套关系。通过定义语法结构的层次关系,可以建立起语法结构的层次关系,使得过程化SQL语言的代码可以按照一定的层次结构进行组织。例如,描述过程化SQL语言中的代码块和函数定义的语法规则,其中,描述的代码块由花括号括起,包含多个语句;而描述的函数定义由函数名、参数列表和代码块组成。
(3)生成解析器代码,运行ANTLR工具,输入上述语法描述文件,即可自动生成能够解析过程化SQL语言的代码。将生成的代码作为PL解析器,通过调用PL解析器即可将任意符合过程化SQL语言语法规则的代码转换为相应的抽象语法树。
由于该PL解析器能够将任意符合过程化SQL语言语法规则的任意代码转换为抽象语法树,因此,服务器通过调用该PL解析器对待转换代码进行词法以及语法分析,将待转换代码转换为抽象语法树。
需要说明的是,由于过程化SQL语言具有更高的灵活性和功能性,因此,允许开发人员在数据库中编写更复杂的逻辑和算法,并封装为可重复使用的数据库访问对象,由数据库编译后,将编译结果存储在本地,以便开发人员重复调用。而为了在Spark平台实现相同的功能特性,同样需要将转换出的Scala代码编译后保存在本地,供开发人员重复调用。实践过程中发现,不同的开发人员并不知晓Spark平台已经保存了哪些功能的编译结果,导致对相同功能的待转换代码进行重复转换以及编译。对此,在图1的基础上,如图3所示,作为步骤S12的可选实施方式,可以包括:
S12-1、计算待转换代码的哈希值。
其中,待转换代码的哈希值通过哈希值算法生成,哈希值算法能够将任意给定的输入数据进行计算,将其转换为固定长度的字符串,该字符串即被称为输入数据的哈希值。并且,对于给定的输入数据,哈希算法会生成唯一的哈希值,即使输入数据发生了细微变化,产生的哈希值也会有较大的差异,因此,本实施例中将历史待转换代码的哈希值作为对应历史编译结果的名称。
S12-2、判断是否有以哈希值作为名称的历史编译结果;
其中,若否,则执行步骤S12-4,若是,则执行步骤S12-3。
S12-3,返回待转换代码已转换完成的提示信息。
S12-4、解析待转换代码,生成待转换代码的抽象语法树。
如此,当服务器检测到将待转换代码的哈希值作为名称的历史编译结果,意味着相同的待转换代码在此之前已经被转换、编译过。因此,无需再对其进行重复转换,直接为用户的客户端返回转换代码已转换完成的提示信息。
实践过程中还发现,随着待转换代码的代码量增加,需要编写复杂的代码转换逻辑。鉴于此,继续参见图3,作为步骤S13的可选实施方式,Scala代码模板包括与多种代码块一一对应的多个子模板,基于Scala代码模板中的多个子模板,步骤S13可以包括:
S13-1、对于从抽象语法树中遍历出的每个目标代码块,根据目标代码块的抽象语法树,获取与目标代码块相对应子模板所需的元数据信息。
对此,应理解的是,由于过程化SQL语言结合了过程语言的特性(如变量、条件判断、循环处理和异常处理等特性)以及SQL语句用于对数据库进行操作和查询的特性,因此,本实施例中的多种代码块包括与过程语言相关的代码块以及数据操作语言(DataManipulation Language,简称:DML)相关的代码块。
其中,与过程语言相关的代码块,表示用于控制SQL执行流程的代码块,例如,变量赋值、表达式计算、if/else判断、while循环等代码块。
数据操作语言相关的代码块,表示用于与数据库操作相关的代码块,例如,Select语句、Select Into语句、Insert语句、Insert select语句、Update语句等代码块。
对于上述每种代码块,事先为该代码块编写有对应的子模板。该子模板相较于完整的功能和语法,缺乏关键的元数据信息,需要从对应代码块中的获取并填充到子模板中。例如,从对应代码块中获取变量名、参数列表、判断条件等作为元数据信息。而为了获取这些元数据信息,可选实施方式中,服务器可以根据目标代码块的抽象语法树,获取与目标代码块相对应子模板所需的元数据信息。如此,在本实施例中,通过归纳总结出的代码块以及对应的子模板,降低代码转换过程的复杂度。
实践过程中还发现,对于一些子模板,其需要的元数据全部来自于对应的代码块,而相较于能够直接从代码块中获取元数据信息的子模板,对于需要连接数据库的子模板,其需要的元数据不仅来自于对应的代码块,还需要借助第三方服务获得。因此,对于上述步骤S13-1,其可选实施方式可以包括:
S13-1-1、对于遍历出的目标代码块,判断目标代码块是否需要连接数据库。
具体的,若是,则执行以下步骤S13-1-2、S13-1-3,若否,则执行以下步骤S13-1-4。
S13-1-2、从目标代码块的抽象语法树中获取数据源名称以及数据表操作信息,并根据数据源名称从数据源管理服务中得到数据源的连接配置信息。
S13-1-3、将数据表操作信息与连接配置信息作为与目标代码块相对应子模板所需的元数据信息。
S13-1-4、从目标代码块的抽象语法树中获取与目标代码块相对应的子模板所需的元数据信息。
通过上述实施方式,对于需要连接数据库的代码块,通过事先准备的源管理服务,从中得到对应子模板所需的其他元数据信息,而无需开发人员手动输入,从而提高了Spark平台代码转换时的智能程度。
可选地,该Scala代码模板基于StringTemplate4以及RDD算子的语法规则编写,Scala代码模板中的需要填充的空缺位置通过占位符进行标记。因此,再次参见图3,作为步骤S14的可选实施方式,包括:
S14-1、调用模板引擎将元数据信息写入Scala代码模板中的占位符标记的位置,并将写入了元数据信息的Scala代码模板转换为目标Scala代码。
其中,StringTemplate4的语法规则定义了元数据信息与占位符之间的绑定机制,当使用的模板引擎生成输出时,该模板引擎利用该绑定机制将实际的数据传递给Scala代码模板,以填充模板中的占位符,并将填充了元数据信息的模板渲染为最终的目标Scala代码。
为了使得本领域技术人员能够更容易使用本申请所要保护的技术方案,下面将结合需要连接数据库以及不需要连接数据的代码片段,给出以下实施方式。但值得说明的是,以下示例仅仅是为了便于理解,并不限定本发明的保护范围。
示例一:
如图4所示,假定将记录有待转换代码的文本命名为“procedure.sql”,其中记录有用于在名为“mytest”的数据源中创建一张名为“t_user”的数据表的代码块,该代码块的详情如下:
CREATE TABLE test1
WITH(
'datasource' = 'mytest',
'table-name'='t_user',
--'sql'='select id,name,c_time from t_user where name<>"abc";
'type' = 'source,sink'
);
对上述代码块,预先定义有与之抽象语法树对应的数据对象,称为“Create_tableContext”。基于该数据对象,服务器调用PL解析器对“procedure.sql”中的上述待转换代码进行解析成抽象语法树。具体的,该转换过程可以基于上述步骤S11、S12实现。
若从抽象语法树中遍历出名为“Create_tableContext”对象,则服务器进一步遍历相应的抽象语法树,判断是否有Create table with语句。若是,意味着该代码块需要连接数据库。其中,该判断过程可以基于上述步骤S13-1-1实现。
继续参见图4,将上述代码块的子模板称为JDBC模板。由JDBC模板中加粗的占位符可以看出,JDBC模板需要的元数据信息包括数据库链接“<jdbcSource.url>”、数据库名称“<jdbcSourcc.username>”、数据库密码“<jdbcSource.password>”、连接驱动等信息。
因此,该服务器解析对应的语法树,从中获取数据表操作信息以及数据源名称。其中,数据表操作信息包括表名、字段名、字段类型、源端表名、数据表源端标识等。图4中的数据源名称为“mytest”,服务器将数据源名称“mytest”发送给提供数据源管理服务的数据源管理设备14,获得该数据源的连接配置信息,包括数据库链接(jdbcUrl)、数据库用户名(root)、数据库密码(password)、连接驱动(jdbcDriver)。
服务器将上述从抽象语法树中获取的数据表操作信息以及连接配置信息,保存在名为JdbcSource数据对象。具体的,上述数据表操作信息与连接配置信息的获取过程可以基于上述步骤S13-1-2、S13-1-3实现。
最后,服务器通过StringTemplate4的模板引擎将JdbcSource数据对象中保存的信息填充到对应占位符标记的位置,将得到目标Scala代码写入名为“target.scala”的文件中。其中,将JdbcSource数据对象填充到模板中的过程可以基于上述步骤S14-1实现。
对于上述转换得到的“target.scala”文件,运行“target.scala”中的目标Scala代码的编译结果,即可实现在名为“mytest”的数据源中创建一张名为“t_user”的数据表。
示例二:
过程化SQL语言作为一种数据库的编程语言,除了支持上述需要连接数据库的建表操作,还支持创建存储过程语句。该存储过程语句,指一段被命名的、可重复使用的代码,用于在数据库中进行存储和执行,即通过存储过程语句封装和执行特定的数据库逻辑操作。相较于上述需要连接数据的建表操作的代码块,其元数据需要借助第三方服务获得;存储过程语句中的代码块,其元数据则可直接从代码块中获取。
如图5所示,假定文件“procedure.sql”中还包括有存储过程语句,对于存储过程语句,本实施例预先定义有与之抽象语法树对应的数据对象,称为“Create_procedure_body”。
因此,服务器调用PL解析器对“procedure.sql”中的待转换代码进行解析后,若解析出名为的“Create_procedure_body”数据对象,则从中获取存储过程语句中的过程名称、入参(名称、类型)、出参(名称、类型)等信息,存储过程语句中的申明变量(名称、类型)及变量的初始化值等信息。
进而,服务器解析Create_procedure_body中存储过程语句的主体部分,即位于图5中的“BEGIN”与“END”之间的代码。
具体的,这部分代码可能包含了:变量赋值、表达式计算、if/else判断、while循环、select into变量、部分DML等代码块。为了记录从待转换代码中获取的元数据信息,本实施例提供有名为CreateProcedure的数据对象,用于对解析出的元数据信息进行保存。
其中,CreateProcedure包括名为BaseOperation对象数组,用于存储每个代码块的元数据信息。可以理解为,BaseOperation的数组中每的一个元素对应一个代码块。具体的,通过BaseOperation对象数组存储代码块的元数据信息的过程可以通过上述步骤S13-1-1、S13-1-4实现。
继续参加图5,本实施例还针对存储过程语句事先编写有对应的Scala模板,可以被称为存储过程模板。为使存储过程语句能够被重复使用,需要转换出的目标Scala代码同样拥有可供重复调用的函数名、函数入参以及出参。
对此,图4示出的存储过程模板中的占位符“<createProc.procedureName>”所标记的位置为函数名的填充位置。同理,该函数的入参与出参均被相应的占位符进行了标记。可以理解为,最终转换出的目标Scala代码中的函数名为“procedure.sql”中记录的存储过程语句的过程名,函数的入参即为存储过程语句的入参,存储过程语句的出参将放在函数的数组中统一返回。
继续参见图5,存储过程模板中还包括<body(createProc.procedureBody)>部分,其对应存储过程语句的主体部分。将其展开后即可得到为“BEGIN”与“END”之间的代码块事先编写的子模板。
例如,“<ifElse(baseOperation.ifElse)>”对应if/else判断的代码块,“<whileLoop(baseOperation.whlleLoop)>”对应while循环的代码块,“<declareParams(baseOperation.declareParams)>”对应变量赋值的代码块。
对于“BEGIN”与“END”之间的代码块,服务器直接从源代码获取对应子模板所需的元数据信息,而无需借助第三方服务获得。
在上述实施例中,基于事先编写的Scala代码模板,将从待转换代码中的解析出的元数据信息填写入Scala代码模板预留的空缺位置,即可将待转换代码转换为能够在Spark平台运行且与待转换代码功能相同的目标Scala代码。
值得说明的是,目前的存储过程语句只能用于同一数据库中执行脚本而无法进行跨源处理。相较于现有的存储过程语句,本实施例可以通过编写特定的子模板,对现有存储过程语句的功能进行扩展,将原本只能在同一数据库中运行的存储过程语句扩展为能够进行跨源或者跨数据库类型计算的存储过程语句。对此,下面以三个示例对利用存储过程语句进行跨源或者跨数据库类型计算的操作进行说明;
示例一:
假定有名为test1与test2的两张数据表分别源自于不同的数据源。若图5所示“procedure.sql”中“BEGIN”与“END”部分,包括有一代码块,用于对teset1表(源表)中id大于1000的记录,将其对应的id、name、c_time字段的值***到test2(目标表)表中与之对应的字段。该代码块的具体详情如下:
INSERT INTO test2 (id, name, c_time)
SELECT id, name, c_time FROM
testl WHERE id>1000;
如图6所示,对于上述代码块,在<body(createProc.procedureBody)>的展开部分,为这段代码提供有对应的子模板<insertSelectSQL(baseOperation.insertSelectSQL)>。在该子模板中,将上述INSERT…SELECT… SQL语句拆分成INSERT…和SELECT…两部分。
其中,SELECT部分为Spark需要对teset1执行SQL的部分;INSERT部分将被拼接为teset2的INSERT数据SQL;将SELECT部分SQL转换为SparkSQL的scala脚本,并将执行结果赋值给RDD;INSERT部分则遍历RDD分区中每行数据;通过INSERT语法生成为teset2***数据所需的INSERT SQL。
示例二:
同样假定有名为test1与test2的两张数据表分别源自于不同的数据源。若图5所示“procedure.sql”中“BEGIN”与“END”部分,包括有一代码块,用于将teset2表(目标表)中的name和c_time字段更新为test1表(源表)中相同id记录的name和c_time。该代码块的具体详情如下:
UPDATE test2 a, testl b SET
a.name=b.name, a.c_time=b.c_time
WHERE a.id=b.id;
如图6所示,在<body(createProc.procedureBody)>的展开部分,为这段代码提供有对应的子模板<updateSQL(baseOperation.updateSQL)>。在该子模板中,将test1部分拼接为SELCET SQL并转换为SparkSQL的scala脚本,并将执行结果赋值给RDD;并将字段和字段位置做映射;然后,在RDD分区中,遍历每行数据;通过更新字段生成teset2表更新数据所需的UPDATE SQL。
示例三:
同样假定有名为test1与test2的两张数据表分别源自于不同的数据源。若图5所示“procedure.sql”中“BEGIN”与“END”部分,包括有一段代码块,用于查询test1表(源表)中name不等于TEST的记录,并通过与test2表(目标表)的id字段进行匹配。如果子查询返回结果,存在满足条件的记录,则将该记录将从test2表中删除。该代码块的具体详情如下:
DELETE FROM test2 a WHERE
EXISTS (SELECT 1 FROM testl b
WHERE a.id=b.id AND
b.name<>'TEST');
如图6所示,在<body(createProc.procedureBody)>的展开部分,为这段代码提供有对应的子模板<deleteSQL(baseOperation.deleteSQL)>。在该子模板中,将DELETE…WHERE EXISTS (SELECT…) SQL语句解析拆分成DELETE…和SELECT…两部分。对于SELECT部分的SQL,将其转换为SparkSQL的scala脚本,其中需要提取联表删除的字段并将SELECT部分替换为该联表删除的字段,并将执行结果赋值给RDD;然后,在RDD分区中,遍历每行数据;通过DELETE部分语法生成test2表***数据所需的DELETE SQL。
通过上述示例可以看出,对于待转换代码中需要进行跨源计算的代码块,为其提供的子模板包括源表计算部分与目标表计算部分,并使用RDD分区,将源表的计算中间结果存储在RDD分区中,使得目标表计算部分从RDD分区获取中间计算结果,并依据RDD分区中的中间结果对目标表进行操作。
以上实施例介绍了代码块的转换过程,继续参见图3,待转换代码被转换为目标Scala代码后,本实施例提供的数据库访问代码转换方法,还包括:
S15,计算待转换代码的哈希值。
S16,将待转换代码的哈希值作为目标Scala代码对应编译结果的名称。
在上述步骤中,将待转换代码的哈希值作为了对应编译结果的名称,如此,当有新的待转换代码时,若检测到该新的待转换代码的哈希值与历史编译结果的名称一致,则不再需要再次对新的待转换代码进行转换、编译,直接使用即可。
此外,为了验证目标Scala代码的编译结果是否能够达到预期的目的,服务器还可以将目标Scala代码编译为jar包,并获取运行该jar包运行所需的依赖信息,包括访问数据库所需驱动的jar包路径、SparkSQL相关的jar包路径以及Spark相关环境参数。将上述jar包路径以及环境参数拼接成spark-submit命令,执行该spark-submit命令,将目标Scala代码的jar包提交到Spark集群;然后,通过SparkLauncher控制目标Scala代码的jar包在Spark集群中执行过程;最后,接收Spark集群执行中的执行日志并在日志对象(slf4j)中打印;解析打印的日志信息,校验其中是否有异常信息日志的标签,从而得到目标Scala代码的jar包在Spark集群中的整体执行结果。
基于与本实施例所提供数据库访问代码转换方法相同的发明构思,本实施例还提供一种数据库访问代码转换装置。该装置包括至少一个可以软件形式存储于存储器或固化在电子设备中的软件功能模块。电子设备中的处理器用于执行存储器中存储的可执行模块。例如,数据库访问代码转换装置所包括的软件功能模块及计算机程序等。请参照图7,从功能上划分,数据库访问代码转换装置20可以包括:
代码接收模块200,用于接收待转换代码,其中,待转换代码为访问数据库的过程化SQL语言;
代码解析模块201,用于解析待转换代码,生成待转换代码的抽象语法树;
代码解析模块201,还用于遍历抽象语法树,得到Spark平台下的Scala代码模板所需的元数据信息;
代码转换模块202,用于将元数据信息写入Scala代码模板的空缺位置,得到与待转换代码功能相同的目标Scala代码。
本实施例中,代码接收模块200用于实现图1中的步骤S11,代码解析模块201用于实现图1中的步骤S12、S13,代码转换模块202用于实现图1中的步骤S14。关于上述各模块的详细描述,可以参见对应步骤的具体实施方式,本实施例不再进行赘述。值得说明的是,由于与数据库访问代码转换方法具有相同的发明构思,上述各模块还可以用于实现该方法的其他步骤或者子步骤。
另外,在本申请各个实施例中的各功能模块可以集成在一起形成一个独立的部分,也可以是各个模块单独存在,也可以两个或两个以上模块集成形成一个独立的部分。
还应理解的是,以上实施方式如果以软件功能模块的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本申请的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本申请各个实施例所述方法的全部或部分步骤。
因此,本实施例还提供一种计算机可读存储介质,该计算机可读存储介质存储有计算机程序,该计算机程序被处理器执行时,实现本实施例提供的数据库访问代码转换方法。其中,该计算机可读存储介质可以是U盘、移动硬盘、只读存储器(ROM,Read-OnlyMemory)、随机存取存储器(RAM,Random Access Memory)、磁碟或者光盘等各种可以存储程序代码的介质。
本实施例提供的一种实施数据库访问代码转换方法的电子设备。如图8所示,该电子设备30可包括处理器301及存储器300。并且,存储器300存储有存储一个或多个程序,处理器通过读取并执行存储器300中与以上实施方式对应的计算机程序,实现本实施例所提供的实施数据库访问代码转换方法。
此外,该电子设备30还包括有通信单元。该存储器300、处理器301以及通信单元各元件相互之间通过***总线304直接或间接地电性连接,以实现数据的传输或交互。
其中,该存储器300可以是基于任何电子、磁性、光学或其它物理原理的信息记录装置,用于记录执行指令、数据等。在一些实施方式中,该存储器300可以是,但不限于,易失存储器、非易失性存储器、存储驱动器等。
在一些实施方式中,该易失存储器可以是随机存取存储器(Random AccessMemory,RAM);在一些实施方式中,该非易失性存储器可以是只读存储器(Read OnlyMemory,ROM)、可编程只读存储器(Programmable Read-Only Memory,PROM)、可擦除只读存储器(Erasable Programmable Read-Only Memory,EPROM)、电可擦除只读存储器(Electric Erasable Programmable Read-Only Memory,EEPROM)、闪存等;在一些实施方式中,该存储驱动器可以是磁盘驱动器、固态硬盘、任何类型的存储盘(如光盘、DVD等),或者类似的存储介质,或者它们的组合等。
该通信单元用于通过网络收发数据。在一些实施方式中,该网络可以包括有线网络、无线网络、光纤网络、远程通信网络、内联网、因特网、局域网(Local Area Network,LAN)、广域网(Wide Area Network,WAN)、无线局域网(Wireless Local Area Networks,WLAN)、城域网(Metropolitan Area Network,MAN)、广域网(Wide Area Network,WAN)、公共电话交换网(Public Switched Telephone Network,PSTN)、蓝牙网络、ZigBee网络、或近场通信(Near Field Communication,NFC)网络等,或其任意组合。在一些实施例中,网络可以包括一个或多个网络接入点。例如,网络可以包括有线或无线网络接入点,例如基站和/或网络交换节点,服务请求处理***的一个或多个组件可以通过该接入点连接到网络以交换数据和/或信息。
该处理器301可能是一种集成电路芯片,具有信号的处理能力,并且,该处理器可以包括一个或多个处理核(例如,单核处理器或多核处理器)。仅作为举例,上述处理器可以包括中央处理单元(Central Processing Unit,CPU)、专用集成电路(ApplicationSpecific Integrated Circuit,ASIC)、专用指令集处理器(Application SpecificInstruction-set Processor,ASIP)、图形处理单元(Graphics Processing Unit,GPU)、物理处理单元(Physics Processing Unit,PPU)、数字信号处理器 (Digital SignalProcessor,DSP)、现场可编程门阵列(Field Programmable Gate Array,FPGA)、可编程逻辑器件(Programmable Logic Device,PLD)、控制器、微控制器单元、简化指令集计算机(Reduced Instruction Set Computing,RISC)、或微处理器等,或其任意组合。
可以理解,图8所示的结构仅为示意。电子设备30还可以具有比图8所示更多或者更少的组件,或者具有与图8所示不同的配置。图8所示的各组件可以采用硬件、软件或其组合实现。
应该理解到的是,在上述实施方式中所揭露的装置和方法,也可以通过其它的方式实现。以上所描述的装置实施例仅仅是示意性的,例如,附图中的流程图和框图显示了根据本申请的多个实施例的装置、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段或代码的一部分,所述模块、程序段或代码的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。也应当注意,在有些作为替换的实现方式中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个连续的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图和/或流程图中的每个方框、以及框图和/或流程图中的方框的组合,可以用执行规定的功能或动作的专用的基于硬件的***来实现,或者可以用专用硬件与计算机指令的组合来实现。
以上所述,仅为本申请的各种实施方式,但本申请的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本申请揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本申请的保护范围之内。因此,本申请的保护范围应所述以权利要求的保护范围为准。

Claims (8)

1.一种数据库访问代码转换方法,其特征在于,所述方法包括:
接收待转换代码,其中,所述待转换代码为访问数据库的过程化SQL语言;
计算所述待转换代码的哈希值;
判断是否有以所述哈希值作为名称的历史编译结果;
若否,则解析所述待转换代码,生成所述待转换代码的抽象语法树,其中,所述历史编译结果表示历史待转换代码的编译结果;
遍历所述抽象语法树,得到Spark平台下的Scala代码模板所需的元数据信息,所述Scala代码模板包括与多种代码块一一对应的多个子模板;该步骤包括:
对于从所述抽象语法树中遍历出的每个目标代码块,根据所述目标代码块的抽象语法树,获取与所述目标代码块相对应子模板所需的元数据信息,其中,对于所述待转换代码中需要进行跨源计算的代码块,为所述需要进行跨源计算的代码块提供的子模板包括源表计算部分与目标表计算部分,并使用RDD分区,将所述源表的计算中间结果存储在所述RDD分区中,使得所述目标表计算部分从所述RDD分区获取中间计算结果,并依据所述RDD分区中的中间结果对目标表进行操作;
将所述元数据信息写入所述Scala代码模板的空缺位置,得到与所述待转换代码功能相同的目标Scala代码。
2.根据权利要求1所述的数据库访问代码转换方法,其特征在于,所述根据所述目标代码块的抽象语法树,获取与所述目标代码块相对应子模板所需的元数据信息,包括:
判断所述目标代码块是否需要连接数据库;
若是,则从所述目标代码块的抽象语法树中获取数据源名称以及数据表操作信息,并根据所述数据源名称从数据源管理服务中得到数据源的连接配置信息;
将所述数据表操作信息与所述连接配置信息作为与所述目标代码块相对应子模板所需的元数据信息;
若否,则从所述目标代码块的抽象语法树中获取与所述目标代码块相对应的子模板所需的元数据信息。
3.根据权利要求1所述的数据库访问代码转换方法,其特征在于,所述方法还包括:
计算所述待转换代码的哈希值;
将所述待转换代码的哈希值作为所述目标Scala代码对应编译结果的名称。
4.根据权利要求1所述的数据库访问代码转换方法,其特征在于,所述解析所述待转换代码,生成所述待转换代码的抽象语法树,包括:
通过过程化SQL语言的解析器对所述待转换代码的词法以及语法进行分析,生成所述待转换代码的抽象语法树。
5.根据权利要求1所述的数据库访问代码转换方法,其特征在于,所述Scala代码模板中的需要填充的空缺位置通过占位符进行标记,所述将所述元数据信息写入所述Scala代码模板的预设位置,得到与所述待转换代码功能相同的目标Scala代码,包括:
调用模板引擎将所述元数据信息写入所述Scala代码模板中的占位符标记的位置,并将写入了元数据信息的Scala代码模板转换为所述目标Scala代码。
6.一种数据库访问代码转换装置,其特征在于,所述装置包括:
代码接收模块,用于接收待转换代码,其中,所述待转换代码为访问数据库的过程化SQL语言;
代码解析模块,用于计算所述待转换代码的哈希值;
判断是否有以所述哈希值作为名称的历史编译结果;
若否,则解析所述待转换代码,生成所述待转换代码的抽象语法树,其中,所述历史编译结果表示历史待转换代码的编译结果;
所述代码解析模块,还用于遍历所述抽象语法树,得到Spark平台下的Scala代码模板所需的元数据信息,所述Scala代码模板包括与多种代码块一一对应的多个子模板;所述代码解析模块还具体用于:
对于从所述抽象语法树中遍历出的每个目标代码块,根据所述目标代码块的抽象语法树,获取与所述目标代码块相对应子模板所需的元数据信息,其中,对于所述待转换代码中需要进行跨源计算的代码块,为所述需要进行跨源计算的代码块提供的子模板包括源表计算部分与目标表计算部分,并使用RDD分区,将所述源表的计算中间结果存储在所述RDD分区中,使得所述目标表计算部分从所述RDD分区获取中间计算结果,并依据所述RDD分区中的中间结果对目标表进行操作;
代码转换模块,用于将所述元数据信息写入所述Scala代码模板的空缺位置,得到与所述待转换代码功能相同的目标Scala代码。
7.一种电子设备,其特征在于,包括:
存储器,用于存储一个或多个程序;
处理器;
当所述一个或多个程序被所述处理器执行时,实现如权利要求1-5中任一项所述的方法。
8.一种计算机可读存储介质,其上存储有计算机程序,其特征在于,该计算机程序被处理器执行时实现如权利要求1-5中任一项所述的方法。
CN202410044913.7A 2024-01-12 2024-01-12 数据库访问代码转换方法、装置及电子设备 Active CN117555925B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202410044913.7A CN117555925B (zh) 2024-01-12 2024-01-12 数据库访问代码转换方法、装置及电子设备

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202410044913.7A CN117555925B (zh) 2024-01-12 2024-01-12 数据库访问代码转换方法、装置及电子设备

Publications (2)

Publication Number Publication Date
CN117555925A CN117555925A (zh) 2024-02-13
CN117555925B true CN117555925B (zh) 2024-05-10

Family

ID=89820909

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202410044913.7A Active CN117555925B (zh) 2024-01-12 2024-01-12 数据库访问代码转换方法、装置及电子设备

Country Status (1)

Country Link
CN (1) CN117555925B (zh)

Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN110245184A (zh) * 2019-05-13 2019-09-17 中国邮政集团公司广东省分公司 一种基于tagSQL的数据处理方法、***及装置
CN112363727A (zh) * 2020-11-10 2021-02-12 中国平安人寿保险股份有限公司 Sql代码的java转换方法、装置、计算机设备及存储介质
CN113010183A (zh) * 2021-04-30 2021-06-22 中国工商银行股份有限公司 一种代码转换方法及装置
CN117112608A (zh) * 2023-08-23 2023-11-24 杭州玳数科技有限公司 一种基于Antlr4的数据库语句转换方法及装置

Family Cites Families (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US10353723B2 (en) * 2017-08-03 2019-07-16 Salesforce.Com, Inc. PL/SQL language parsing at a virtual machine
US11640282B2 (en) * 2019-10-24 2023-05-02 Here Global B.V. Method, apparatus, and system for providing a broker for data modeling and code generation

Patent Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN110245184A (zh) * 2019-05-13 2019-09-17 中国邮政集团公司广东省分公司 一种基于tagSQL的数据处理方法、***及装置
CN112363727A (zh) * 2020-11-10 2021-02-12 中国平安人寿保险股份有限公司 Sql代码的java转换方法、装置、计算机设备及存储介质
CN113010183A (zh) * 2021-04-30 2021-06-22 中国工商银行股份有限公司 一种代码转换方法及装置
CN117112608A (zh) * 2023-08-23 2023-11-24 杭州玳数科技有限公司 一种基于Antlr4的数据库语句转换方法及装置

Non-Patent Citations (3)

* Cited by examiner, † Cited by third party
Title
Functional Pearl: A SQL to C Compiler in 500 Lines of Code;Rompf, T等;《20th ACM SIGPLAN International Conference on Functional Programming (ICFP)》;20160120;2-9 *
赵文耘等.《软件工程 方法与实践》.上海:复旦大学出版社,2014,208-209. *
面向数据库性能的SQL语句解析与翻译;崔娜;;现代电子技术;20160601(11);107-110+115 *

Also Published As

Publication number Publication date
CN117555925A (zh) 2024-02-13

Similar Documents

Publication Publication Date Title
US10698682B1 (en) Computerized software development environment with a software database containing atomic expressions
US6321376B1 (en) Apparatus and method for semi-automated generation and application of language conformity tests
US6055370A (en) Apparatus which allows data sharing amongst computer programs from different program environments
CN106844643A (zh) 一种基于模板引擎的数据库动态生成方法
US20080046868A1 (en) Method and system for template-based code generation
WO2023221408A1 (zh) 深度学习框架的算子处理方法、装置、设备和存储介质
CN112579626A (zh) 多源异构sql查询引擎的构建方法及装置
US20130152061A1 (en) Full fidelity parse tree for programming language processing
CN109116828B (zh) 一种控制器中模型代码配置方法和装置
CN113204571B (zh) 涉及写入操作的sql执行方法、装置及存储介质
CN115016793A (zh) 基于语法树的代码生成方法和装置、电子设备、存储介质
CN111367893A (zh) 数据库版本迭代的方法及装置
CN111143403A (zh) Sql转换方法及装置、存储介质
EP0520708B1 (en) Method and apparatus for converting high level form abstract syntaxes into an intermediate form
CN116483850A (zh) 数据处理方法、装置、设备以及介质
CN114356964A (zh) 数据血缘构建方法、装置、存储介质及电子设备
CN111694846B (zh) 一种基于Type 2 JDBC驱动的分离模式分布式存储过程实现方法
CN114764558A (zh) 一种sql方言转换方法、装置、***及存储介质
CN117555925B (zh) 数据库访问代码转换方法、装置及电子设备
CN108509187B (zh) 一种自动生成软件平台mib功能代码的方法及***
CN116010461A (zh) 数据血缘关系解析方法及装置、存储介质及电子设备
US11604774B2 (en) Method and apparatus of converting schema in deep learning framework, and computer storage medium
CN113608748B (zh) C语言转换Java语言的数据处理方法、装置及设备
CN114816364A (zh) 基于Swagger动态生成范本文件的方法、装置及应用
US8997035B2 (en) Extensible template-based code generator builder

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant