CN116991418A - 代码生成方法、装置、设备及存储介质 - Google Patents

代码生成方法、装置、设备及存储介质 Download PDF

Info

Publication number
CN116991418A
CN116991418A CN202310885440.9A CN202310885440A CN116991418A CN 116991418 A CN116991418 A CN 116991418A CN 202310885440 A CN202310885440 A CN 202310885440A CN 116991418 A CN116991418 A CN 116991418A
Authority
CN
China
Prior art keywords
information
query
data table
function
query function
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.)
Pending
Application number
CN202310885440.9A
Other languages
English (en)
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.)
Beijing Baidu Netcom Science and Technology Co Ltd
Original Assignee
Beijing Baidu Netcom Science and Technology Co Ltd
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 Beijing Baidu Netcom Science and Technology Co Ltd filed Critical Beijing Baidu Netcom Science and Technology Co Ltd
Priority to CN202310885440.9A priority Critical patent/CN116991418A/zh
Publication of CN116991418A publication Critical patent/CN116991418A/zh
Pending legal-status Critical Current

Links

Classifications

    • 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
    • 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/22Indexing; Data structures therefor; Storage structures
    • G06F16/2282Tablespace storage structures; Management thereof
    • 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
    • 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/28Databases characterised by their database models, e.g. relational or object models
    • G06F16/284Relational databases

Landscapes

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

Abstract

本公开提供了一种代码生成方法、装置、设备及存储介质,涉及数据处理领域,尤其涉及数据库技术领域。具体实现方案为:基于数据表描述信息,确定表结构信息以及查询函数描述信息,表结构信息包括业务数据库中的数据表的相关信息,查询函数描述信息包括用于业务端调用的查询函数的相关信息,且表结构信息和查询函数描述信息均记录于数据表描述信息中;基于表结构信息,生成数据结构声明;基于表结构信息以及查询函数描述信息,生成查询函数的实现代码;基于数据结构声明以及查询函数的实现代码,生成目标代码,目标代码用于实现业务端对业务数据库的访问。在对接不同业务时,代码生成方法能够自动生成实现业务端对数据库访问的目标代码,效率高。

Description

代码生成方法、装置、设备及存储介质
技术领域
本公开涉及数据处理技术领域,尤其涉及数据库技术领域,具体涉及一种代码生成方法、装置、设备及存储介质。
背景技术
应用程序通常需要将数据存储在用户设备上,例如存储于本地数据库中。对于一个具体业务,需要在数据库里创建一个数据表,表结构与业务所需的数据结构相对应,应用程序可以通过SQL(Structured Query Language)语句对数据库中的业务数据进行增加、删除、修改或查询。
发明内容
本公开提供了一种代码生成方法、装置、设备及存储介质。
根据本公开的一方面,提供了一种代码生成方法,包括:基于数据表描述信息,确定表结构信息以及查询函数描述信息,其中,表结构信息包括业务数据库中的数据表的相关信息,查询函数描述信息包括用于业务端调用的查询函数的相关信息,且表结构信息和查询函数描述信息均记录于数据表描述信息中;
基于表结构信息,生成数据结构声明;
基于表结构信息以及查询函数描述信息,生成查询函数的实现代码;
基于数据结构声明以及查询函数的实现代码,生成目标代码,目标代码用于实现业务端对业务数据库的访问。
根据本公开的另一方面,提供了一种代码生成装置,包括:确定单元,用于基于数据表描述信息,确定表结构信息以及查询函数描述信息,其中,表结构信息包括业务数据库中的数据表的相关信息,查询函数描述信息包括用于业务端调用的查询函数的相关信息,且表结构信息和查询函数描述信息均记录于数据表描述信息中;
第一生成单元,用于基于表结构信息,生成数据结构声明;
第二生成单元,用于基于表结构信息以及查询函数描述信息,生成查询函数的实现代码;
第三生成单元,用于基于数据结构声明以及查询函数的实现代码,生成目标代码,目标代码用于实现业务端对业务数据库的访问。
根据本公开的另一方面,提供了一种电子设备,包括:
至少一个处理器;以及
与该至少一个处理器通信连接的存储器;其中,
该存储器存储有可被该至少一个处理器执行的指令,该指令被该至少一个处理器执行,以使该至少一个处理器能够执行本公开实施例中任一的方法。
根据本公开的另一方面,提供了一种存储有计算机指令的非瞬时计算机可读存储介质,其中,该计算机指令用于使该计算机执行根据本公开实施例中任一的方法。
根据本公开的另一方面,提供了一种计算机程序产品,包括计算机程序,该计算机程序在被处理器执行时实现根据本公开实施例中任一的方法。
本公开实施例提供的代码生成方法、装置、设备及存储介质,通过基于数据表描述信息,确定表结构信息以及查询函数描述信息,其中,表结构信息包括业务数据库中的数据表的相关信息,查询函数描述信息包括用于业务端调用的查询函数的相关信息,且表结构信息和查询函数描述信息均记录于数据表描述信息中;基于表结构信息,生成数据结构声明;基于表结构信息以及查询函数描述信息,生成查询函数的实现代码;基于数据结构声明以及查询函数的实现代码,生成目标代码,目标代码用于实现业务端对业务数据库的访问。在对接不同业务时,只需要维护不同业务的数据表描述信息,便可自动生成能够实现业务端应用程序对数据库访问的目标代码,简化了业务接入的工作量,且开发效率高,通用性好。
应当理解,本部分所描述的内容并非旨在标识本公开的实施例的关键或重要特征,也不用于限制本公开的范围。本公开的其它特征将通过以下的说明书而变得容易理解。
附图说明
附图用于更好地理解本方案,不构成对本公开的限定。其中:
图1为应用本公开实施例的代码生成方法的***的结构示意图;
图2是根据本公开实施例提供的代码生成方法的示意图;
图3是根据本公开实施例提供的代码生成方法的应用架构图;
图4是根据本公开实施例提供的代码生成方法的应用流程图;
图5A是根据本公开实施例提供的数据表描述信息的示意图;
图5B是根据图5A生成的数据结构声明的示意图;
图5C是根据图5A生成的查询函数的实现代码的示意图;
图6是根据本公开另一实施例提供的代码生成方法的示意图;
图7是根据本公开实施例提供的代码生成装置的示意图;
图8是用来实现本公开实施例的代码生成方法的电子设备的框图。
具体实施方式
以下结合附图对本公开的示范性实施例做出说明,其中包括本公开实施例的各种细节以助于理解,应当将它们认为仅仅是示范性的。因此,本领域普通技术人员应当认识到,可以对这里描述的实施例做出各种改变和修改,而不会背离本公开的范围。同样,为了清楚和简明,以下的描述中省略了对公知功能和结构的描述。
本公开实施例提供一种代码生成方法、装置、电子设备及存储介质。具体地,本公开实施例的代码方法可以由电子设备执行,其中,该电子设备可以为终端或者服务器等设备。该终端可以为智能手机、平板电脑、笔记本电脑、智能语音交互设备、智能家电、穿戴式智能设备、飞行器、智能车载终端等设备,终端还可以包括客户端,该客户端可以是音频客户端、视频客户端、浏览器客户端、即时通信客户端或小程序等。服务器可以是独立的物理服务器,也可以是多个物理服务器构成的服务器集群或者分布式***,还可以是提供云服务、云数据库、云计算、云函数、云存储、网络服务、云通信、中间件服务、域名服务、安全服务、内容分发网络(Content Delivery Network,CDN)、以及大数据和人工智能平台等基础云计算服务的云服务器。
相关技术中,应用程序经常需要将数据存储在用户设备上,例如在用户设备中使用本地数据库,该本地数据可以是轻型数据库(SQLite)等。
通常的做法是,对于一种具体业务,在数据库里创建一个数据表,表结构与业务所需的数据结构相对应,应用程序通过SQL语句对业务数据进行增删改查。
但是,相关技术中存在的问题如下:
(1)当业务种类较多时,每种业务都需建立自己的数据表,然后通过各自对应的接口代码进行对应数据表的查询访问,但各种业务之间的应用模式(接口代码的功能)是重复的,存在人力浪费。
(2)SQL语句往往与业务代码混杂,不易维护。
(3)当表结构需要变化时,版本之间的升级容易出问题。
以下结合具体方式对上述问题进行说明,相关技术中,应用程序使用本地数据库的具体方式包括以下几种:
(1)直接使用SQL语句:应用程序采用字符串拼装的方式产生SQL语句访问数据库。
直接使用SQL语句具有如下缺点:
1)SQL语句与应用程序代码混杂,不易维护。
2)动态生成的SQL语句容易产生语句注入问题,存在安全隐患。
3)各种变量需要与字符串来回转换,运行效率低,而且容易产生转换错误。
(2)使用ORM(Object Relation Mapping,对象关系映射)框架:ORM将SQL语句封装为一系列方法,应用程序通过ORM方法访问数据。
ORM框架具有如下缺点:
1)虽然SQL语句成分变成了方法调用,但本质上仍是在业务代码中拼接SQL语句,仍然有SQL语句与应用程序代码混杂的问题。
2)ORM内部往往仍然是进行字符串拼接,同样存在注入的风险,运行效率低。
并且,除了上述缺点外,直接使用SQL语句以及使用ORM框架还存在如下共同缺点:
1)不同业务间不能复用接口代码,需要重复开发,存在人力浪费。
2)版本升级需要人工维护,容易出现问题,举例来说:
假设数据表从1.0版本升级到1.1版本时增加了一个字段(假设为昵称(nick_name)字段);之后从1.7版升级到1.8版时又增加了一个字段(假设为生日(birthday)字段)。不同用户升级到1.8版本的过程为:
a)对于新用户,直接创建1.8版本的数据表,带有nick_name和birthday。
b)对于1.7版本的用户,在1.7版数据表上新增birthday字段。
c)对于1.0版本及以前的用户,需要在数据表上新增nick_name和birthday两个字段。
但是,1.8版本与1.0版本在时间上可能相隔较远,开发人员会忘记1.0与1.1版本的变化,只关注1.7与1.8版本的变化,这样升级后的数据表会缺少nick_name字段,存在字段缺失问题。
当然,相关技术中还存在一种升级方法,即升级分成多个阶段,每阶段只升一个版本。例如1.0升级到1.8的过程为:1.0->1.1->1.2->…->1.7->1.8。但随着版本迭代,这种升级方式的过程越来越长,性能会逐渐劣化,而且中间某些版本的升级可能变得没有意义。
为了解决上述问题中的至少一个,本公开实施例提供一种代码生成方法、装置、设备及存储介质,通过基于数据表描述信息,确定表结构信息以及查询函数描述信息,其中,表结构信息包括业务数据库中的数据表的相关信息,查询函数描述信息包括用于业务端调用的查询函数的相关信息,且表结构信息和查询函数描述信息均记录于数据表描述信息中;基于表结构信息,生成数据结构声明;基于表结构信息以及查询函数描述信息,生成查询函数的实现代码;基于数据结构声明以及查询函数的实现代码,生成目标代码,目标代码用于实现业务端对业务数据库的访问。在对接不同业务时,只需要维护不同业务的数据表描述信息,便可自动生成能够实现业务端应用程序对数据库访问的目标代码,简化了业务接入的工作量,且开发效率高,通用性好。
以下将结合附图对本公开实施例进行具体说明。
图1为应用本公开实施例的代码生成方法的***的结构示意图。请参照图1,该***包括终端110和服务器120等;终端110和服务器120之间通过网络连接,比如,通过有线或无线网络连接等。
其中,终端110,可以用于显示图形用户界面。其中,该终端用于通过图形用户界面与用户进行交互,例如通过终端下载安装相应的客户端并运行,例如通过调用相应的小程序并运行,例如通过登录网站呈现相应的图像用户界面等。在本公开实施例中,终端110可以安装有业务端应用程序,并显示应用程序界面。服务器120可以基于数据表描述信息,确定表结构信息以及查询函数描述信息,其中,表结构信息包括业务数据库中的数据表的相关信息,查询函数描述信息包括用于业务端调用的查询函数的相关信息,且表结构信息和查询函数描述信息均记录于数据表描述信息中;基于表结构信息,生成数据结构声明;基于表结构信息以及查询函数描述信息,生成查询函数的实现代码;基于数据结构声明以及查询函数的实现代码,生成目标代码,目标代码用于实现业务端对业务数据库的访问。目标代码可以应用于终端110的应用程序中,使得用户可以通过应用程序访问终端110本地数据库或服务器120的云端数据库中的业务数据。
需要说明的是,应用程序可以为安装在台式机上的应用程序、也可以为安装在移动终端的应用程序,还可以为嵌入到应用程序中的小程序等。
需要注意的是,上述应用场景仅是为了便于理解本公开的精神和原理而示出,本公开的实施例在此方面不受任何限制。相反,本公开的实施例可以应用于适用的任何场景。
以下进行详细说明。需说明的是,以下实施例的描述顺序不作为对实施例优先顺序的限定。
图2是根据本公开实施例提供的代码生成方法的示意图;图3是根据本公开实施例提供的代码生成方法的应用架构图;图4是根据本公开实施例提供的代码生成方法的应用流程图。
请参照图2至图4,本公开实施例提供一种代码生成方法200,可以用于数据框架中,以直接提供业务端可用的查询(访问)接口。方法200可以包括以下步骤S201至步骤S204。
步骤S201,基于数据表描述信息,确定表结构信息以及查询函数描述信息,其中,表结构信息包括业务数据库中的数据表的相关信息,查询函数描述信息包括用于业务端调用的查询函数的相关信息,且表结构信息和查询函数描述信息均记录于数据表描述信息中。
步骤S202,基于表结构信息,生成数据结构声明。
步骤S203,基于表结构信息以及查询函数描述信息,生成查询函数的实现代码。
步骤S204,基于数据结构声明以及查询函数的实现代码,生成目标代码,目标代码用于实现业务端对业务数据库的访问。
数据表描述信息可以包含表结构信息以及查询函数描述信息。表结构信息可以包括业务数据库中的数据表的相关信息。业务数据库为用于存储业务数据的数据库,业务数据库中可以包含一个或多个数据表,表结构信息可以包括这些数据表的表名、字段名等信息。
查询函数描述信息可以包括可供业务端即应用程序直接使用的查询函数的相关信息,例如可以包括查询函数的名称等等。查询函数应该理解为是数据库访问的相关函数或者接口,这些查询通常是有条件的,条件是与业务相关的,即查询函数为各个业务特有的,可以记录在数据表描述信息中。当然,查询函数中的查询应广义理解,并不是只包含狭义的从数据表中查询满足条件的某一或某几条数据,其是指对业务数据库的访问等各项操作,比如查询函数可以包括对数据表进行查询、增加、删除和修改等的具体函数。在一个实施例中,查询函数包括查询数据表中的数据的数据查询函数,也可以包括在数据表中增加数据的数据增加函数等等。
为了便于理解,以下先对方法200的应用场景进行说明。
如图3,可以理解,业务端的应用程序与业务数据库之间可以通过接口功能(业务相关的生成代码)实现访问,这部分接口功能可以由业务数据表中的查询函数(get_contact(对数据表中的数据进行查询的函数),update_contact(在数据表中增加数据的函数)等等)实现。
可以理解,查询函数是可以直接供业务端使用的,也就是说查询函数是作为业务端可以访问业务数据库的接口。可以理解,业务端可以直接调用查询函数,查询函数通过目标代码实现对数据库的访问。
目标代码,即由查询函数到数据库层SQLite(业务数据库)的访问的具体代码实现,其可以由方法200根据数据表描述信息得到,如图3中生成器可以用于实现方法200。
在一个实施例中,如图3中,业务无关的框架层中示出了可以直接访问数据库的一些相关函数,例如,抽象数据表(create_table、create_index等),抽象语句(execute、bind等),抽象数据库连接(begin、commit、execute等),语句池(get_statement、create_statement等)等。可以理解,目标代码可以由其中的部分相关函数封装而成,即方法200可以利用这些相关函数自动生成能够实现查询函数功能的目标代码,也就是把目标代码封装为查询函数。
业务数据表中的公开函数(+开头的),其名称和数量可以由数据表描述信息中的query决定,对于不同的业务会有不同的公开方法。其中的“get_contact”/“update_contact”为查询函数,将在下述实施例中进行具体阐述。
数据库层中,SQLite是个常见的数据库层实现,但本实施例中,方法200还可以与其它支持SQL的数据库配合使用。
如图4所示,可以理解,对于每种业务都需要有自己特定的数据表结构,相应的需要使用自己特定的查询函数进行增删改查。这是各种业务共通的使用模式。这种模式与具体的数据表的表结构可以进行拆分,将业务相关的部分提取出来。这些与业务相关的部分可以记录在数据表描述信息中(如表结构信息和查询函数描述信息),即数据表描述信息为各个业务的差异化信息,其余部分即通过差异化信息生成具体数据表的维护和查询接口的方法(即方法200)可以为固定模式。在图4所示的实施例中,生成器可以作为固定模式即方法200的实现。生成器以差异化信息(数据表描述信息)为输入,生成的源码即源代码可以作为目标代码。而图4中的固定的依赖可以为除差异化信息外的其他接口(即各个业务通用)的源代码。
可以理解,方法200(即生成器)可以用于业务开发阶段,例如在应用程序(Application,APP)开发阶段,可以利用生成器自动生成源代码(目标代码)。而应用程序发布后,在运行数据时,源代码在编译器编译后可以在应用程序中使用,使得业务端的用户可以直接利用APP对数据库进行操作,该过程中生成器不再发挥作用。
生成器可以提高开发效率;通过生成器将原本写源代码的工作变为写数据表描述信息,减少了工作量,且生成器固化了目标代码的流程和结构,消除了人为错误的空间。
图5A是根据本公开实施例提供的数据表描述信息的示意图;图5B是根据图5A生成的数据结构声明的示意图;图5C是根据图5A生成的查询函数的实现代码的示意图。
请参照图5A至图5C,数据表描述信息中可以包括表结构信息以及查询函数描述信息。步骤S201可以对数据表描述信息进行解析,即将数据表描述信息中的整段信息解析为一行一行的数据。在解析后,可以提取数据表描述信息中的表结构信息和查询函数描述信息。
如图5A所示,数据表描述信息包括数据表1的表结构信息、查询函数描述信息1以及查询函数描述信息2,表结构信息可以包括该数据表1的表名(contact)以及数据表1中的各个字段(fields)。以查询函数描述信息1为例,查询函数描述信息1可以包括查询函数1(get_contact)以及其的查询语句描述1。步骤S201可以解析数据表描述信息,获取表结构信息以及查询函数描述信息。
如图5B所示,步骤S202可以根据表结构信息,得到数据结构声明contact_item,可以理解,数据结构声明可以表示数据表中的数据的构成,即contact_item表示数据表1(contact)中的一条数据的组成内容。数据结构声明与表结构信息为相对应的关系,例如均包含数据表中的各个字段以及字段类型等。
如图5C所示,步骤S203可以根据表结构信息以及查询函数描述信息,生成查询函数的实现代码,即生成图5A中的查询函数1(get_contact)以及查询函数2(update_contact)的实现代码。具体实现可以参考下述实施例,在此不做展开说明。
在步骤S204中,至少可以基于数据结构声明以及查询函数的实现代码得到目标代码,例如将数据结构声明以及查询函数的实现代码拼装为目标代码。
可以理解,对于不同的业务,只需要维护或者生成针对该业务的数据表描述信息,方法200便可以利用数据表描述信息自动生成目标代码,实现应用程序到业务数据库的接口功能,实现了业务间的复用,无需针对每个业务重复人工编写代码,节省了人力,提高了开发效率。并且,通过方法200生成的代码独立于应用程序本身的代码,不存在代码注入和代码混杂问题,容易维护,且安全性更好。
在一些实施例中,步骤S202中,基于表结构信息,生成数据结构声明,可以包括:
基于表结构信息,确定数据表中字段的字段名以及字段对应的字段类型;
基于字段名以及字段类型,生成数据结构声明。
根据表结构信息,可以得到数据表中各个字段的字段名以及该字段对应的字段类型。字段类型可以为字段的格式,例如数字、文本、日期等等。
如图5A,数据表1的表结构信息中包含有四个字段,字段名分别为:编号(id)、姓名(name)、昵称(nick_name)和生日(birthday)。并且表结构信息中记录有各个字段的字段类型,例如编号的字段类型为整数(bigint),姓名和昵称的字段类型为文本(text),生日的字段类型为日期(date)。
根据上述字段名和字段类型,可以生成该数据表的数据结构声明。可以理解,数据结构声明中也包含该数据表的各个字段名和字段类型,但是展示格式与数据表描述信息的展示格式可以有所不同。如图5B,以C++语言为例,数据结构声明中,字段类型展示在字段名前方,而在表结构信息中,字段名位于字段类型前方。且对于各个字段,例如编号字段在数据格式声明中的字段类型可以为数值(uint64_t),与其在数据表描述信息中的字段类型(整数(bigint))有所不同,但是两者所代表的含义相同。又例如,姓名和昵称字段在数据结构声明中的字段类型为字符(string),而生日字段在数据结构声明中的字段类型为日期(time_t)。
另外,上述数据结构声明是以C++语言为例,对于不同的编程语言,例如C++和Java等,上述字段格式和类型都可能会有所不同。
本实施例中,根据表结构信息,可以生成符合当前编程语言环境的数据结构声明,无需人工编写,提高了开发效率。
在一些实施例中,查询函数描述信息可以包括查询函数以及查询函数对应的查询语句描述。
步骤S203中,基于表结构信息以及查询函数描述信息,生成查询函数的实现代码,包括以下步骤:
步骤一,基于表结构信息以及查询函数描述信息,生成查询语句描述对应的查询语句;
步骤二,基于查询语句描述,对查询函数的输入参数进行参数绑定,得到参数绑定函数;
步骤三,基于查询语句以及参数绑定函数,生成查询函数的实现代码。
如图5A所示,以查询函数描述信息1为例,查询函数描述信息1包括查询函数1(get_contact),以及其对应的查询语句描述1(SQL):SELECT#{fields}FROM$TABLE WHERE[id]=#{id}。
可以理解,查询函数是指查询函数的名称,查询语句描述可以为查询函数对应的查询语句的描述,可以理解,该查询语句描述并非为可以直接访问业务数据库的代码,其只是体现了业务端或者用户可以直观获取查询函数的逻辑或功能的一种直观描述。
如查询函数get_contact,其查询语句描述可以用SQL语句表示,例如SELECT#{fields}FROM$TABLE WHERE[id]=#{id},即查询表格id为#{id},字段为#{fields}的数据。
如图5C,图中示出了查询函数1的实现代码,其包括查询语句1(sql="SELECT"+fields()+"FROM"+tableName()+"WHERE[id]=?;")以及参数绑定函数1(bind_bigint)。
步骤一可以通过查询函数描述信息,得到查询语句描述,然后依靠表结构信息中的表名和字段名等信息展开查询语句描述,从而生成查询语句描述对应的查询语句。可以理解,查询语句为能够直接访问业务数据库的代码,其含义与查询语句描述一致,但格式有所不同。通过查询语句描述1可以得到查询语句1。例如,查询语句描述中的#{fields}、$TABLE和[id]=#{id}分别与查询语句中的fields()、tableName()以及[id]=?对应。
继续参照图5A,查询语句描述中还包含了该查询函数的输入参数,如#{id}中的id表示该查询函数get_contact的输入参数为id,因此,步骤二可以基于查询语句描述,得到查询函数的输入参数。
可以理解,输入参数是指SQL语句中所需使用的变量,包括使用的字段,查询过滤条件等。以输入参数为id为例,输入参数可以为数值。例如,1、2、3等。当然,本实施例中为了避免直接在查询语句中使用数值等具体的输入参数,可以针对输入参数生成参数绑定函数(bind_bigint),即采用字符的形式替代直接输入数值,可以避免具体的输入参数直接与查询语句结合后产生语法错误,导致查询语句无法正确执行的问题。
步骤三在生成参数绑定函数后,可以根据参数绑定函数生成该参数绑定函数的实现,例如stmt.bind_bigint(id),然后将可以将查询语句以及参数绑定函数的实现代码拼装得到查询函数的实现代码。
本实施例能够根据表结构信息和查询函数描述信息,自动生成查询函数的实现代码,无需人工编写代码,代码产出率高。并且,通过参数绑定将变量(输入参数)结合到SQL语句中,查询的整个过程中不需要做类型转换,运行效率高,并且降低了SQL注入的风险,也排除了类型转换错误的问题。
在一些实施例中,步骤一中的基于表结构信息以及查询函数描述信息,生成查询语句描述对应的查询语句,包括:
基于表结构信息以及查询语句描述,确定第一表名以及第一字段名,其中,第一表名为查询语句描述中所涉及的数据表的名称,第一字段名为查询语句描述中所涉及的数据表中字段的名称;
基于查询语句描述,确定查询函数的输入参数;
基于第一表名、第一字段名以及输入参数,生成查询语句。
可以理解,业务数据库中可能有多个数据表,对应的数据表描述信息中也可以包括多个数据表的表结构信息。
根据表结构信息可以展开查询语句描述中所需要的表名(即第一表名)以及所需要的字段名(即第一字段名)。例如,查询语句描述1(SQL):SELECT#{fields}FROM$TABLEWHERE[id]=#{id},根据该语句中的$TABLE以及#{fields}可以分别确定第一表名和第一字段名。可以理解,#{fields}这里可以是直接的字段名,也可以是用掩码表示的字段名,如果是用掩码表示的字段名,则可以根据掩码获取掩码对应的字段名,即第一字段名。
另外,通过解析查询语句描述还可以得到其对应的查询函数的输入参数,如#{id}中的id即为输入参数。
在得到第一表名、第一字段名以及输入参数后,基于第一表名、第一字段名以及输入参数以及查询语句的格式,可以生成查询语句。例如,查询语句1(sql="SELECT"+fields()+"FROM"+tableName()+"WHERE[id]=?;")。其中,fields()为基于第一表名确定,tableName()为基于第一字段名确定,[id]=?即根据输入参数确定。
本实施例可以通过表结构信息以及查询函数描述信息,自动生成查询语句,无需人工编写代码,代码产出率高,开发效率高。
在一些实施例中,在查询函数需要向业务端返回查询结果的情况下,基于表结构信息以及查询函数描述信息,生成查询函数的实现代码,还包括:
基于查询语句描述,确定查询函数的输出参数;
基于输出参数,生成用于返回查询结果的返回函数;
基于查询语句以及参数绑定函数,生成查询函数的实现代码,包括:
基于查询语句、参数绑定函数以及返回函数,生成查询函数的实现代码。
可以理解,查询函数大致可以分为两类,一种是需要向业务端返回查询结果,例如查询数据表中满足某些条件的所有数据等。一种是无需向业务端返回查询结果,例如删除数据表中的某条数据,或者在数据表中增加某条数据等。
对于无需向业务端返回查询结果的查询函数,可以通过上述实施例中的步骤一至步骤三,生成查询函数的实现代码。
对于需要向业务端返回查询结果的查询函数,在生成参数绑定函数和查询语句的同时,还需要生成返回函数。
具体来说可以先根据查询语句描述,确定查询函数的输出参数。输出参数是指查询结果输出,可以是单条或多条。例如,根据查询语句描述1(SQL):SELECT#{fields}FROM$TABLE WHERE[id]=#{id},可以确定查询函数get_contact需要利用SELECT语句来返回查询结果,即查询函数get_contact为需要返回查询结果的查询函数,此时可以利用输出参数(result)表示输出结果,如图5C。然后可以利用输出参数,生成返回函数stmt.do_query(result),即生成能够返回输出参数result的返回函数。
并根据查询语句、参数绑定函数以及返回函数生成查询函数的实现代码,例如将查询语句、参数绑定函数的实现的代码以及返回函数的实现代码拼装成查询函数的实现代码,如图5C。本实施例可以自动生成将查询结果返回业务端的返回函数,无需人工编写代码,开发效率更高。
在一些实施例中,表结构信息还可以包括索引函数的相关信息,例如索引函数的名称,索引类型即是否唯一索引,以及索引字段等等。如图5A中,索引函数为unique_id_index。索引字段可以表示用于建立索引的字段,其可以为一个或多个字段。
可以理解,如图5A,查询函数描述信息可以采用如下形式,例如对于查询函数1:query:get_contact,其查询语句描述为:sql:SELECT#{fields}FROM$TABLE WHERE[id]=#{id},对于查询函数2:query:update_contact,其查询语句描述为:force:true,sql:UPDATE$TABLE SET#{fields}WHERE[id]=#{id}。
上述方式为不使用索引的形式,对于使用索引做过滤条件的查询,可以用using(index)的快捷描述方式,两种方式生成的代码完全相同。例如,索引函数为unique_id_index,对于查询函数1:query:get_contact,其查询语句描述为:sql:SELECT${using(unique_id_index)},对于查询函数2:query:update_contact,其查询语句描述为:force:true,sql:UPDATE${using(unique_id_index)}。
可以理解,对于使用多个字段做过滤的情况,采用索引函数能显著缩短查询描述,例如:利用id和name字段作索引进行查询,索引函数的相关信息为:index:id_name_index,fields:[id,name]。以查询函数1的查询函数描述信息为:query:get_contact,sql:SELECT#{fields}FROM$TABLE WHERE[id]=#{id}AND[name]=#{name}为例,在采用索引的形式下,其可以缩短为query:get_contact,sql:SELECT${using(id_name_index)}。
另外,图5C还表示出了查询函数2(update_contact)的查询语句描述的实现代码。本实施例中,步骤S203在生成查询函数2的实现代码时,可以先通过查询函数描述信息确定查询函数2对应的查询语句2sql="UPDATE"+tableName()+"SET"+expand_fields()+"WHERE[id]=?;",同时还可以生成参数绑定函数2(bind_item和bind_bigint),以及其的实现代码(stmt.bind_item(item)和stmt.bind_bigint(id))。
图6是根据本公开另一实施例提供的代码生成方法的示意图;请参照图6,在一些实施例中,数据表描述信息还包括业务数据库的当前版本信息;方法200还包括以下步骤S601至S603。
步骤S601,基于更新数据,确定更新数据的目标版本信息以及更新数据中各个目标数据表的第一子版本信息;
步骤S602,基于各个目标数据表的第一子版本信息以及当前版本信息,对业务数据库进行更新;
步骤S603,基于目标版本信息,对当前版本信息进行更新。
如图5A所示,数据表描述信息中还可以包括业务数据库的当前版本,例如1.8版本。
在一些实施例中,数据表描述信息还可以包括业务数据库中的数据表的第一创建版本信息以及数据表中的字段的第二创建版本信息。
图5A中,数据表描述信息中还可以包括各个数据表的第一创建版本信息,例如,数据表1的创建版本(即第一创建版本信息)为1.0版本。
数据表描述信息中还可以包括每个数据表中的各个字段的第二创建版本信息,例如数据表1中,昵称字段的创建版本(第二创建版本信息)为1.1版本,生日字段的创建版本(第二创建版本信息)为1.8版本,其余字段未标注创建版本即表示这些字段的创建版本与数据表的创建版本一致,即编号字段和姓名字段的创建版本(第二创建版本信息)均为1.0版本。
当然,在一些实施例中,也可以直接在编号字段和姓名字段后标注其创建版本。
通过在数据表描述信息中标注数据库的当前版本、各个数据表和字段的创建版本,使得升级过程也可以由生成器自动完成,无需人工升级,可以减少人为疏忽的风险。
可以理解,当数据库需要升级或更新时,即需要在数据库中创建表格或增添字段等时,可以获取更新数据,更新数据中可以包含目标版本信息以及更新数据中各个目标数据表的第一子版本信息。可以理解,目标数据表均为更新数据中提到的数据表,在业务数据库中可能存在该数据表,也可能不存在(即更新时需要创建的数据表等)。
目标版本信息为更新数据对应的版本,例如1.9版本。可以理解,更新数据中也可以包括利用更新数据进行更新后的业务数据库中所包含的各个数据表(即目标数据表)的第一子版本信息。例如,更新数据库中可以包括目标数据表描述信息,该目标数据表描述信息的结构与数据表描述信息一致。例如,若在更新时需要增加一个数据表2,那么目标数据表描述信息中除了包含目标版本信息以及图5A中的数据表1的表结构信息以及查询函数描述信息外,还可以包括数据表2的表结构信息,例如,数据表2的表名,数据表2中的字段(例如字段1和字段2),同时目标数据表描述信息中还可以包括数据表2的创建版本(第一子版本信息)为1.9版本,以及字段1和字段2的创建版本(第二子版本信息)为1.9版本,当然由于字段1和字段2的创建版本与数据表2一致,也可以不额外标注在目标数据表描述信息中。
可以理解,第一子版本信息为目标数据表的创建版本,第二子版本信息为字段的创建版本。
在更新时,步骤S601可以通过更新数据中的目标数据表描述信息,得到目标版本信息以及目标数据表(数据表1和数据表2)的第一子版本信息。目标数据表为目标数据表描述信息中包括的各个数据表。
然后在步骤S602中,可以根据各个目标数据表的第一子版本信息以及当前版本信息,对业务数据库进行更新。
在一个具体实施例中,步骤S602中的基于各个目标数据表的第一子版本信息以及当前版本信息,对业务数据库进行更新,可以包括:针对各个目标数据表中的第一目标数据表,在第一目标数据表的第一子版本信息高于当前版本信息的情况下,在业务数据库中创建第一目标数据表。
遍历各个目标数据表,例如依次遍历目标数据表描述信息的数据表1和数据表2。针对各个目标数据表,以第一目标数据表为例,若第一目标数据表的第一子版本信息高于当前版本信息时,可以在数据库中创建该第一目标数据表。
例如,在遍历到数据表1时,由于目标数据表描述信息中的数据表1的创建版本为1.0,小于或等于当前版本1.8,此时可以不对业务数据库进行操作。
在遍历到数据表2时,由于目标数据表描述信息中的数据表2的创建版本为1.9,大于当前版本信息1.8,此时,可以在业务数据库中创建数据表2,即通过版本信息在更新过程中自动实现数据表的创建,实现对业务数据库的更新,无需人工维护。
在实现对业务数据库的更新后,可以将目标版本信息作为当前版本信息,即将业务数据库的当前版本信息修改为1.9版本。具体而言,更新后可以利用目标数据表描述信息替换原有数据表描述信息,并将目标版本信息作为当前版本信息,从而使得在更新过程中,只需要维护数据表描述信息,就可以快速实现业务数据库的自动更新,更新效率高。
本实施例中,通过版本信息可以自动实现业务数据库的升级,无需人工维护,改善更新时字段容易错漏的情况,且对于当前版本较低的业务数据库,也无需逐个版本进行更新,可以直接更新至最高版本,快速实现业务数据库的更新,更新效率更高。
在一些实施例中,在更新时,方法200还包括以下步骤:
针对各个目标数据表中的第二目标数据表,基于更新数据,确定第二目标数据表中的各个目标字段的第二子版本信息;
针对各个目标字段中的第一目标字段,在第一目标字段的第二子版本信息高于当前版本信息的情况下,在业务数据库中的与第二目标数据表对应的数据表中创建第一目标字段。
可以理解,在更新时还可以对数据表中的字段进行更新,例如更新时需要在数据表1中添加年龄字段。那么目标数据表描述信息中数据表1的字段可以包括编号字段、姓名字段、昵称字段、生日字段和年龄字段。其中,编号字段、姓名字段、昵称字段、生日字段的创建版本(第二子版本信息)与图5A所示相同,年龄字段由于为更新新添加的字段,因此,年龄字段的第二子版本信息为1.9版本。
在遍历各个数据表时,以第二目标数据表为数据表1为例,可以遍历数据表1中的各个第一目标字段(即数据表1的各个字段),分别将其的第二子版本信息与当前版本信息进行比较,由于编号字段、姓名字段、昵称字段、生日字段的第二子版本信息均小于或等于当前版本信息1.8,可以不对数据库中的数据表1进行修改,由于年龄字段的第二子版本信息为1.9,大于当前版本信息1.8,因此,可以在业务数据库中的数据表1中创建年龄字段。
本实施例通过目标字段的第二子版本信息以及当前版本信息,可以实现字段的自动创建,实现对业务数据库的更新,无需人工维护,降低了更新的出错率,提高了更新效率。
在上述实施例的基础上,方法200还可以包括:
基于表结构信息,生成通用函数的实现代码;
基于数据结构声明以及查询函数的实现代码,生成目标代码,包括:基于数据结构声明、通用函数的实现代码以及查询函数的实现代码,生成目标代码。
可以理解,除了查询函数等各个业务特有的方法外,业务数据库还可以通过一些通用函数实现某些通用操作,例如,通用函数可以包括建表函数,***表函数和升级管理(如图3中的do_upgrade(数据库升级函数))等,这些为各个业务共通的部分,即对各种业务都需要,而且模式固定,可以不需要添加至数据表描述信息中。
在生成目标代码的过程中,还可以利用表结构信息中的表名等信息自动生成通用函数的实现代码。然后可以将数据结构声明、通用函数的实现代码以及查询函数的实现代码拼装为目标代码,从而使得方法200不仅可以实现查询函数等各个业务特有的实现代码的自动生成,还可以实现各个业务共通的通用函数的实现代码的自动生成,进一步简化了人力成本,提高了代码的产出率,提高了开发效率。
在一个具体实施例中,代码生成方法可以包括数据表接口(目标代码)生成以及升级管理两个方面。
数据表接口生成包括整体设计、数据表描述(数据表描述信息)以及生成器。
1.整体设计
每种业务需要自己特定的表结构,相应的需要自己特定的查询语句进行增删改查。这是各种业务共通的使用模式。这种模式与具体的表结构可以进行拆分,将业务相关的部分提取出来。表结构(表结构信息)和查询语句(查询函数描述信息)为差异化信息,其余部分为固定模式。针对固定模式,我们可以设计一个生成器,以差异化信息为输入,产生出具体数据表的维护和查询接口。其结构如图3所示,接口(即目标代码)生成的过程如图4所示。
2.数据表描述
数据表描述需要包含的信息如图5A所示。
(1)数据表的结构(表结构信息):有多少个字段,每个是什么类型。
(2)索引描述(索引函数):用哪些字段建立索引。
(3)查询描述(查询函数描述信息):查询用的SQL语句(查询语句描述)以及对应的输入输出(输入参数以及输出参数)。
(4)版本信息(当前版本信息以及创建版本信息):数据表在哪个版本引入,每个字段在哪个版本添加(参见下方“升级管理”的实施例)。
3.生成器
上面的数据表描述实际上包含了业务所需的所有数据库相关信息,由此我们可以借助自动化方式产生出数据表管理层的代码,直接提供功能接口(查询函数和通用函数)给业务层使用。
生成的内容包括:
(1)公共的数据结构声明,对应于数据表的表结构信息。对于图5A中的数据表描述信息,生成结果如图5B所示。
(2)数据表对象的声明和实现(查询函数的实现代码生成)。对于图5A中的数据表描述信息,生成结果如图5C所示。
查询函数的实现代码生成的简要过程为:
(1)解析数据表描述信息,得到表结构(表结构信息)和查询语句信息(查询函数描述信息)。
(2)进一步分析SQL语句(查询语句描述),得到查询所需的输入输出参数信息(输入参数以及输出参数)。
(3)根据表结构(表结构信息)生成公共数据结构描述(数据结构声明)。
(4)生成基本方法(通用函数的实现代码),包括建表,***,升级管理。
(5)生成查询方法(查询函数的实现代码),其中包括:
a)根据表结构信息展开语句(查询语句描述)中所需的表名称(第一表名)和字段名称(第一字段名)。
b)根据语句结构可能需要生成参数绑定方法(参数绑定函数,如bind_bigint,bind_item等)。
c)对于SELECT类语句,需要生成查询结果向数据结构转换的方法(返回函数,如Statement::do_query)。
针对升级管理,如图5A所示,数据表描述信息中,已经给数据表和字段做好了必要的版本标记(创建版本)。根据这些标记,升级的过程为:
(1)取得用户数据库的当前版本号,即当前版本信息(例如1.8)。
(2)对每个有版本标记的表(目标数据表),检查标记版本号(第一子版本信息)是否高于当前版本号(当前版本信息);高于则创建对应的表。
(3)对于表中每个有版本标记的字段,检查标记版本号(第二子版本信息)是否高于当前版本号(当前版本信息);高于则新增对应的字段。
(4)更新数据库版本号(当前版本信息)为目标版本号,即目标版本信息(例如1.9),升级完成。
这个过程也可以是由生成器产生,只要表和字段做好版本标记,升级过程严格保证不会有遗漏。
通过本实施例提供的方法,生成器的编写是一次性投入,建设完成后不需要随着具体业务需求而变化。每个具体业务只需要维护数据表描述,所有的接口代码都由接口生成器产生,工作量极小。试验中的实际代码产出比(每写一行数据表描述信息可产出的代码行数)可达到10倍以上。且数据表描述简单易懂,且与业务代码隔离,可维护性更好。
并且,利用本实施例的方法的优点如下:
(1)效率提升,采用本方法后,每次有接具体业务需求,所需工作量极小,效率可以提升一个数量级。
(2)SQL隔离,所有SQL相关描述隔离在一个独立文件中,与业务代码不混杂,可维护性更好。
(3)无类型转换,通过参数绑定将变量结合到SQL语句中,查询的整个过程中不需要做类型转换,运行效率高,并且彻底杜绝SQL注入的风险,也排除了类型转换错误的问题。
(4)自动升级,只要标注好必要的版本信息,升级的过程可以全自动完成;避免了人为疏忽的风险。
图7是根据本公开实施例提供的代码生成装置的示意图;请参照图7,本公开实施例提供一种代码生成装置700,包括以下单元。
确定单元701,用于基于数据表描述信息,确定表结构信息以及查询函数描述信息,其中,表结构信息包括业务数据库中的数据表的相关信息,查询函数描述信息包括用于业务端调用的查询函数的相关信息,且表结构信息和查询函数描述信息均记录于数据表描述信息中;
第一生成单元702,用于基于表结构信息,生成数据结构声明;
第二生成单元703,用于基于表结构信息以及查询函数描述信息,生成查询函数的实现代码;
第三生成单元704,用于基于数据结构声明以及查询函数的实现代码,生成目标代码,目标代码用于实现业务端对业务数据库的访问。
在一些实施例中,第一生成单元702还用于:
基于表结构信息,确定数据表中字段的字段名以及字段对应的字段类型;
基于字段名以及字段类型,生成数据结构声明。
在一些实施例中,查询函数描述信息包括查询函数以及查询函数对应的查询语句描述;第二生成单元703还用于:
基于表结构信息以及查询函数描述信息,生成查询语句描述对应的查询语句;
基于查询语句描述,对查询函数的输入参数进行参数绑定,得到参数绑定函数;
基于查询语句以及参数绑定函数,生成查询函数的实现代码。
在一些实施例中,第二生成单元703还用于:
基于表结构信息以及查询语句描述,确定第一表名以及第一字段名,其中,第一表名为查询语句描述中所涉及的数据表的名称,第一字段名为查询语句描述中所涉及的数据表中字段的名称;
基于查询语句描述,确定查询函数的输入参数;
基于第一表名、第一字段名以及输入参数,生成查询语句。
在一些实施例中,在查询函数需要向业务端返回查询结果的情况下,第二生成单元703还用于:
基于查询语句描述,确定查询函数的输出参数;
基于输出参数,生成用于返回查询结果的返回函数;
第三生成单元704还用于:
基于查询语句、参数绑定函数以及返回函数,生成查询函数的实现代码。
在一些实施例中,数据表描述信息还包括业务数据库的当前版本信息;装置还包括:更新单元,更新单元用于:
基于更新数据,确定更新数据的目标版本信息以及更新数据中各个目标数据表的第一子版本信息;
基于各个目标数据表的第一子版本信息以及当前版本信息,对业务数据库进行更新;
基于目标版本信息,对当前版本信息进行更新。
在一些实施例中,更新单元还用于:
针对各个目标数据表中的第一目标数据表,在第一目标数据表的第一子版本信息高于当前版本信息的情况下,在业务数据库中创建第一目标数据表。
在一些实施例中,更新单元还用于:
针对各个目标数据表中的第二目标数据表,基于更新数据,确定第二目标数据表中的各个目标字段的第二子版本信息;
针对各个目标字段中的第一目标字段,在第一目标字段的第二子版本信息高于当前版本信息的情况下,在业务数据库中的与第二目标数据表对应的数据表中创建第一目标字段。
在一些实施例中,数据表描述信息还包括业务数据库中的数据表的第一创建版本信息以及数据表中的字段的第二创建版本信息。
在一些实施例中,第三生成单元704还用于:
基于表结构信息,生成通用函数的实现代码;
基于数据结构声明以及查询函数的实现代码,生成目标代码,包括:基于数据结构声明、通用函数的实现代码以及查询函数的实现代码,生成目标代码。
本公开实施例的装置的各模块、子模块的具体功能和示例的描述,可以参见上述方法实施例中对应步骤的相关描述,在此不再赘述。
本公开的技术方案中,所涉及的用户个人信息的获取,存储和应用等,均符合相关法律法规的规定,且不违背公序良俗。
根据本公开的实施例,本公开还提供了一种电子设备、一种可读存储介质和一种计算机程序产品。
本公开实施例还提供一种电子设备,包括:至少一个处理器;以及与至少一个处理器通信连接的存储器;其中,存储器存储有可被至少一个处理器执行的指令,指令被至少一个处理器执行,以使至少一个处理器能够执行上述任一项实施例中的方法。
本公开实施例还提供一种存储有计算机指令的非瞬时计算机可读存储介质,其中,计算机指令用于使计算机执行上述任一项实施例中的方法。
本公开实施例还提供一种计算机程序产品,包括计算机程序,计算机程序在被处理器执行时实现上述任一项实施例中的方法。
图8示出了可以用来实施本公开的实施例的示例电子设备800的示意性框图。电子设备旨在表示各种形式的数字计算机,诸如,膝上型计算机、台式计算机、工作台、个人数字助理、服务器、刀片式服务器、大型计算机、和其它适合的计算机。电子设备还可以表示各种形式的移动装置,诸如,个人数字助理、蜂窝电话、智能电话、可穿戴设备和其它类似的计算装置。本文所示的部件、它们的连接和关系、以及它们的功能仅仅作为示例,并且不意在限制本文中描述的和/或者要求的本公开的实现。
如图8所示,设备800包括计算单元801,其可以根据存储在只读存储器(ROM)802中的计算机程序或者从存储单元808加载到随机访问存储器(RAM)803中的计算机程序,来执行各种适当的动作和处理。在RAM 803中,还可存储设备800操作所需的各种程序和数据。计算单元801、ROM 802以及RAM 803通过总线804彼此相连。输入/输出(I/O)接口805也连接至总线804。
设备800中的多个部件连接至I/O接口805,包括:输入单元806,例如键盘、鼠标等;输出单元807,例如各种类型的显示器、扬声器等;存储单元808,例如磁盘、光盘等;以及通信单元809,例如网卡、调制解调器、无线通信收发机等。通信单元809允许设备800通过诸如因特网的计算机网络和/或各种电信网络与其他设备交换信息/数据。
计算单元801可以是各种具有处理和计算能力的通用和/或专用处理组件。计算单元801的一些示例包括但不限于中央处理单元(CPU)、图形处理单元(GPU)、各种专用的人工智能(AI)计算芯片、各种运行机器学习模型算法的计算单元、数字信号处理器(DSP)、以及任何适当的处理器、控制器、微控制器等。计算单元801执行上文所描述的各个方法和处理,例如代码生成方法。例如,在一些实施例中,代码生成方法可被实现为计算机软件程序,其被有形地包含于机器可读介质,例如存储单元808。在一些实施例中,计算机程序的部分或者全部可以经由ROM 802和/或通信单元809而被载入和/或安装到设备800上。当计算机程序加载到RAM 803并由计算单元801执行时,可以执行上文描述的代码生成方法的一个或多个步骤。备选地,在其他实施例中,计算单元801可以通过其他任何适当的方式(例如,借助于固件)而被配置为执行代码生成方法。
本文中以上描述的***和技术的各种实施方式可以在数字电子电路***、集成电路***、现场可编程门阵列(FPGA)、专用集成电路(ASIC)、专用标准产品(ASSP)、芯片上***的***(SOC)、负载可编程逻辑设备(CPLD)、计算机硬件、固件、软件、和/或它们的组合中实现。这些各种实施方式可以包括:实施在一个或者多个计算机程序中,该一个或者多个计算机程序可在包括至少一个可编程处理器的可编程***上执行和/或解释,该可编程处理器可以是专用或者通用可编程处理器,可以从存储***、至少一个输入装置、和至少一个输出装置接收数据和指令,并且将数据和指令传输至该存储***、该至少一个输入装置、和该至少一个输出装置。
用于实施本公开的方法的程序代码可以采用一个或多个编程语言的任何组合来编写。这些程序代码可以提供给通用计算机、专用计算机或其他可编程数据处理装置的处理器或控制器,使得程序代码当由处理器或控制器执行时使流程图和/或框图中所规定的功能/操作被实施。程序代码可以完全在机器上执行、部分地在机器上执行,作为独立软件包部分地在机器上执行且部分地在远程机器上执行或完全在远程机器或服务器上执行。
在本公开的上下文中,机器可读介质可以是有形的介质,其可以包含或存储以供指令执行***、装置或设备使用或与指令执行***、装置或设备结合地使用的程序。机器可读介质可以是机器可读信号介质或机器可读储存介质。机器可读介质可以包括但不限于电子的、磁性的、光学的、电磁的、红外的、或半导体***、装置或设备,或者上述内容的任何合适组合。机器可读存储介质的更具体示例会包括基于一个或多个线的电气连接、便携式计算机盘、硬盘、随机存取存储器(RAM)、只读存储器(ROM)、可擦除可编程只读存储器(EPROM或快闪存储器)、光纤、便捷式紧凑盘只读存储器(CD-ROM)、光学储存设备、磁储存设备、或上述内容的任何合适组合。
为了提供与用户的交互,可以在计算机上实施此处描述的***和技术,该计算机具有:用于向用户显示信息的显示装置(例如,CRT(阴极射线管)或者LCD(液晶显示器)监视器);以及键盘和指向装置(例如,鼠标或者轨迹球),用户可以通过该键盘和该指向装置来将输入提供给计算机。其它种类的装置还可以用于提供与用户的交互;例如,提供给用户的反馈可以是任何形式的传感反馈(例如,视觉反馈、听觉反馈、或者触觉反馈);并且可以用任何形式(包括声输入、语音输入、或者触觉输入)来接收来自用户的输入。
可以将此处描述的***和技术实施在包括后台部件的计算***(例如,作为数据服务器)、或者包括中间件部件的计算***(例如,应用服务器)、或者包括前端部件的计算***(例如,具有图形用户界面或者网络浏览器的用户计算机,用户可以通过该图形用户界面或者该网络浏览器来与此处描述的***和技术的实施方式交互)、或者包括这种后台部件、中间件部件、或者前端部件的任何组合的计算***中。可以通过任何形式或者介质的数字数据通信(例如,通信网络)来将***的部件相互连接。通信网络的示例包括:局域网(LAN)、广域网(WAN)和互联网。
计算机***可以包括客户端和服务器。客户端和服务器一般远离彼此并且通常通过通信网络进行交互。通过在相应的计算机上运行并且彼此具有客户端-服务器关系的计算机程序来产生客户端和服务器的关系。服务器可以是云服务器,也可以为分布式***的服务器,或者是结合了区块链的服务器。
应该理解,可以使用上面所示的各种形式的流程,重新排序、增加或删除步骤。例如,本公开中记载的各步骤可以并行地执行也可以顺序地执行也可以不同的次序执行,只要能够实现本公开公开的技术方案所期望的结果,本文在此不进行限制。
上述具体实施方式,并不构成对本公开保护范围的限制。本领域技术人员应该明白的是,根据设计要求和其他因素,可以进行各种修改、组合、子组合和替代。任何在本公开的原则之内所作的修改、等同替换和改进等,均应包含在本公开保护范围之内。

Claims (23)

1.一种代码生成方法,包括:
基于数据表描述信息,确定表结构信息以及查询函数描述信息,其中,所述表结构信息包括业务数据库中的数据表的相关信息,所述查询函数描述信息包括用于业务端调用的查询函数的相关信息,且所述表结构信息和所述查询函数描述信息均记录于所述数据表描述信息中;
基于所述表结构信息,生成数据结构声明;
基于所述表结构信息以及所述查询函数描述信息,生成所述查询函数的实现代码;
基于所述数据结构声明以及所述查询函数的实现代码,生成目标代码,所述目标代码用于实现所述业务端对所述业务数据库的访问。
2.根据权利要求1所述的方法,其中,基于所述表结构信息,生成数据结构声明,包括:
基于所述表结构信息,确定所述数据表中字段的字段名以及所述字段对应的字段类型;
基于所述字段名以及所述字段类型,生成所述数据结构声明。
3.根据权利要求1或2所述的方法,其中,所述查询函数描述信息包括所述查询函数以及所述查询函数对应的查询语句描述;
基于所述表结构信息以及所述查询函数描述信息,生成所述查询函数的实现代码,包括:
基于所述表结构信息以及所述查询函数描述信息,生成所述查询语句描述对应的查询语句;
基于所述查询语句描述,对所述查询函数的输入参数进行参数绑定,得到参数绑定函数;
基于所述查询语句以及所述参数绑定函数,生成所述查询函数的实现代码。
4.根据权利要求3所述的方法,其中,基于所述表结构信息以及所述查询函数描述信息,生成所述查询语句描述对应的查询语句,包括:
基于所述表结构信息以及所述查询语句描述,确定第一表名以及第一字段名,其中,所述第一表名为所述查询语句描述中所涉及的所述数据表的名称,所述第一字段名为所述查询语句描述中所涉及的所述数据表中字段的名称;
基于所述查询语句描述,确定所述查询函数的所述输入参数;
基于所述第一表名、所述第一字段名以及所述输入参数,生成所述查询语句。
5.根据权利要求3或4所述的方法,其中,在所述查询函数需要向所述业务端返回查询结果的情况下,基于所述表结构信息以及所述查询函数描述信息,生成所述查询函数的实现代码,还包括:
基于所述查询语句描述,确定所述查询函数的输出参数;
基于所述输出参数,生成用于返回所述查询结果的返回函数;
基于所述查询语句以及所述参数绑定函数,生成所述查询函数的实现代码,包括:
基于所述查询语句、所述参数绑定函数以及所述返回函数,生成所述查询函数的实现代码。
6.根据权利要求1-5中任一项所述的方法,所述数据表描述信息还包括所述业务数据库的当前版本信息;所述方法还包括:
基于更新数据,确定更新数据的目标版本信息以及所述更新数据中各个目标数据表的第一子版本信息;
基于所述各个目标数据表的第一子版本信息以及所述当前版本信息,对所述业务数据库进行更新;
基于所述目标版本信息,对所述当前版本信息进行更新。
7.根据权利要求6所述的方法,其中,基于所述各个目标数据表的第一子版本信息以及所述当前版本信息,对所述业务数据库进行更新,包括:
针对所述各个目标数据表中的第一目标数据表,在所述第一目标数据表的第一子版本信息高于所述当前版本信息的情况下,在所述业务数据库中创建所述第一目标数据表。
8.根据权利要求6或7所述的方法,所述方法还包括:
针对所述各个目标数据表中的第二目标数据表,基于所述更新数据,确定所述第二目标数据表中的各个目标字段的第二子版本信息;
针对所述各个目标字段中的第一目标字段,在所述第一目标字段的第二子版本信息高于所述当前版本信息的情况下,在所述业务数据库中的与所述第二目标数据表对应的数据表中创建所述第一目标字段。
9.根据权利要求6-8中任一项所述的方法,其中,所述数据表描述信息还包括所述业务数据库中的数据表的第一创建版本信息以及所述数据表中的字段的第二创建版本信息。
10.根据权利要求1-9中任一项所述的方法,所述方法还包括:
基于所述表结构信息,生成通用函数的实现代码;
基于所述数据结构声明以及所述查询函数的实现代码,生成目标代码,包括:基于所述数据结构声明、所述通用函数的实现代码以及所述查询函数的实现代码,生成目标代码。
11.一种代码生成装置,包括:
确定单元,用于基于数据表描述信息,确定表结构信息以及查询函数描述信息,其中,所述表结构信息包括业务数据库中的数据表的相关信息,所述查询函数描述信息包括用于业务端调用的查询函数的相关信息,且所述表结构信息和所述查询函数描述信息均记录于所述数据表描述信息中;
第一生成单元,用于基于所述表结构信息,生成数据结构声明;
第二生成单元,用于基于所述表结构信息以及所述查询函数描述信息,生成所述查询函数的实现代码;
第三生成单元,用于基于所述数据结构声明以及所述查询函数的实现代码,生成目标代码,所述目标代码用于实现所述业务端对所述业务数据库的访问。
12.根据权利要求11所述的装置,其中,所述第一生成单元还用于:
基于所述表结构信息,确定所述数据表中字段的字段名以及所述字段对应的字段类型;
基于所述字段名以及所述字段类型,生成所述数据结构声明。
13.根据权利要求11或12所述的装置,其中,所述查询函数描述信息包括所述查询函数以及所述查询函数对应的查询语句描述;所述第二生成单元还用于:
基于所述表结构信息以及所述查询函数描述信息,生成所述查询语句描述对应的查询语句;
基于所述查询语句描述,对所述查询函数的输入参数进行参数绑定,得到参数绑定函数;
基于所述查询语句以及所述参数绑定函数,生成所述查询函数的实现代码。
14.根据权利要求13所述的装置,其中,所述第二生成单元还用于:
基于所述表结构信息以及所述查询语句描述,确定第一表名以及第一字段名,其中,所述第一表名为所述查询语句描述中所涉及的所述数据表的名称,所述第一字段名为所述查询语句描述中所涉及的所述数据表中字段的名称;
基于所述查询语句描述,确定所述查询函数的所述输入参数;
基于所述第一表名、所述第一字段名以及所述输入参数,生成所述查询语句。
15.根据权利要求13或14所述的装置,其中,在所述查询函数需要向所述业务端返回查询结果的情况下,所述第二生成单元还用于:
基于所述查询语句描述,确定所述查询函数的输出参数;
基于所述输出参数,生成用于返回所述查询结果的返回函数;
所述第三生成单元还用于:
基于所述查询语句、所述参数绑定函数以及所述返回函数,生成所述查询函数的实现代码。
16.根据权利要求11-15中任一项所述的装置,所述数据表描述信息还包括所述业务数据库的当前版本信息;所述装置还包括:更新单元,所述更新单元用于:
基于更新数据,确定更新数据的目标版本信息以及所述更新数据中各个目标数据表的第一子版本信息;
基于所述各个目标数据表的第一子版本信息以及所述当前版本信息,对所述业务数据库进行更新;
基于所述目标版本信息,对所述当前版本信息进行更新。
17.根据权利要求16所述的装置,其中,所述更新单元还用于:
针对所述各个目标数据表中的第一目标数据表,在所述第一目标数据表的第一子版本信息高于所述当前版本信息的情况下,在所述业务数据库中创建所述第一目标数据表。
18.根据权利要求16或17所述的装置,其中,所述更新单元还用于:
针对所述各个目标数据表中的第二目标数据表,基于所述更新数据,确定所述第二目标数据表中的各个目标字段的第二子版本信息;
针对所述各个目标字段中的第一目标字段,在所述第一目标字段的第二子版本信息高于所述当前版本信息的情况下,在所述业务数据库中的与所述第二目标数据表对应的数据表中创建所述第一目标字段。
19.根据权利要求16-18中任一项所述的装置,其中,所述数据表描述信息还包括所述业务数据库中的数据表的第一创建版本信息以及所述数据表中的字段的第二创建版本信息。
20.根据权利要求11-19中任一项所述的装置,其中,所述第三生成单元还用于:
基于所述表结构信息,生成通用函数的实现代码;
基于所述数据结构声明以及所述查询函数的实现代码,生成目标代码,包括:基于所述数据结构声明、所述通用函数的实现代码以及所述查询函数的实现代码,生成目标代码。
21.一种电子设备,包括:
至少一个处理器;以及
与所述至少一个处理器通信连接的存储器;其中,
所述存储器存储有可被所述至少一个处理器执行的指令,所述指令被所述至少一个处理器执行,以使所述至少一个处理器能够执行权利要求1-10中任一项所述的方法。
22.一种存储有计算机指令的非瞬时计算机可读存储介质,其中,所述计算机指令用于使所述计算机执行根据权利要求1-10中任一项所述的方法。
23.一种计算机程序产品,包括计算机程序,所述计算机程序在被处理器执行时实现根据权利要求1-10中任一项所述的方法。
CN202310885440.9A 2023-07-18 2023-07-18 代码生成方法、装置、设备及存储介质 Pending CN116991418A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202310885440.9A CN116991418A (zh) 2023-07-18 2023-07-18 代码生成方法、装置、设备及存储介质

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202310885440.9A CN116991418A (zh) 2023-07-18 2023-07-18 代码生成方法、装置、设备及存储介质

Publications (1)

Publication Number Publication Date
CN116991418A true CN116991418A (zh) 2023-11-03

Family

ID=88522457

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202310885440.9A Pending CN116991418A (zh) 2023-07-18 2023-07-18 代码生成方法、装置、设备及存储介质

Country Status (1)

Country Link
CN (1) CN116991418A (zh)

Similar Documents

Publication Publication Date Title
CN111177231B (zh) 报表生成方法和报表生成装置
CN110555030B (zh) 一种sql语句的处理方法和装置
US20130332449A1 (en) Generating data processing code from a directed acyclic graph
CN102402559A (zh) 一种数据库升级脚本的生成方法和装置
CN108108986B (zh) 一种客户关系管理***的设计方法、装置及电子设备
CN113448562B (zh) 一种逻辑代码自动生成方法、装置和电子设备
CN104317964A (zh) 一种基于iBatis的对象关系映射方法及***
CN111125064A (zh) 一种生成数据库模式定义语句的方法和装置
CN110109983B (zh) 一种操作Redis数据库的方法和装置
CN112130888B (zh) 应用程序更新的方法、装置、设备和计算机存储介质
US20200319942A1 (en) Infrastructure base model api
CN114443076A (zh) 镜像构建方法、装置、设备及存储介质
CN113760733A (zh) 一种单元测试方法和装置
US7487227B2 (en) Scripting engine having a sequencer table and a plurality of secondary tables for network communication software
US9489436B2 (en) Gateway enablement of analytic database services
WO2023103432A1 (zh) 代码文件编辑方法、装置、电子设备以及存储介质
US11687503B2 (en) Maintaining foreign key references across domains
CN116991418A (zh) 代码生成方法、装置、设备及存储介质
CN105279032A (zh) 一种同步接口报文与javaBean的方法及装置
CN114661402A (zh) 一种界面渲染方法、装置、电子设备及计算机可读介质
CN113656433A (zh) 实体对象扩展方法、装置、电子设备和存储介质
CN113515306A (zh) 一种***移植的方法及装置
CN108334621B (zh) 数据库操作方法、装置、设备及计算机可读存储介质
CN111459933A (zh) Gdb数据动态扩展方法、装置及存储介质
CN115563183B (zh) 查询方法、装置及程序产品

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