建表语句生成方法、装置、设备及存储介质
技术领域
本发明实施例涉及计算机技术领域,尤其涉及一种建表语句生成方法、装置、设备及存储介质。
背景技术
伴随互联网的高速发展,企业的业务数据成倍增长,原有单个数据表的模式已不满足业务发展的需要,通常需要将业务数据均匀地拆分为多个分表进行存放。在数据拆分存放之前,首先需要编辑分表的建表语句,以便通过建表语句进行分表的创建。
现有技术中,在进行分表的建表语句编辑时,是在单个数据表的建表语句的基础上,以人工的方式对建表语句进行复制和修改,从而形成各个分表的建表语句。
然而现有技术中,由于每个分表的建表语句都需要人工进行复制和修改,当分表数量较大时,分表的建表语句的生成效率较低。
发明内容
本发明实施例提供一种建表语句生成方法、装置、设备及存储介质,以解决分表的建表语句的生成效率低的问题。
第一方面,本发明实施例提供一种建表语句生成方法,包括:
获取第一数据表的第一建表语句和用户输入的分表数量;
通过预置的正则表达式,对所述第一建表语句中所述第一数据表的表名进行修改,生成数量为所述分表数量的第二建表语句,其中,每个第二建表语句用于生成所述第一数据表的一个分表;
输出各个第二建表语句。
在一种可能的实施方式中,所述预置的正则表达式包括用于匹配所述第一建表语句中表名所在行的第一正则表达式,和用于匹配所述表名所在行中的表名所在位置的第二正则表达式。
在一种可能的实施方式中,所述匹配模块,具体用于:
提取所述第一建表语句的各行语句,并通过所述第一正则表达式和所述第二正则表达式,确定所述第一建表语句中的表名所在行的表名所在位置;
按照预设的第一分表命名规则,将所述表名所在位置的字段替换为所述第一数据表的第一分表的表名,得到所述第一表名对应的第二建表语句,其中,所述第一分表为当前所生成的建表语句对应的分表;
若当前已生成的第二建表语句的数量小于所述分表数量,则跳转执行以下步骤:提取所述第一建表语句的各行语句,并通过所述第一正则表达式和所述第二正则表达式,确定所述第一建表语句中的表名所在行的表名所在位置。
在一种可能的实施方式中,提取所述第一建表语句,并通过所述第一正则表达式和所述第二正则表达式,确定所述第一建表语句中的表名所在行的表名所在位置,包括:
提取所述第一建表语句中的各行语句,并将所述第一正则表达式分别与所述第一建表语句中的各行语句进行匹配,确定所述表名所在行;
通过所述第二正则表达式对所述表名所在行进行匹配,确定所述表名所在位置。
在一种可能的实施方式中,所述第一建表语句中的语句的类型包括以下四种:表名所在行、普通行、索引行、尾行;
所述预置的正则表达式还包括用于匹配所述第一建表语句中索引行的第三正则表达式,和用于匹配所述第一建表语句中的尾行的第四正则表达式;
提取所述第一建表语句的各行语句,并通过所述第一正则表达式和所述第二正则表达式,确定所述第一建表语句中的表名所在行的表名所在位置,包括:
依次提取所述第一建表语句的各行语句;
针对所述第一建表语句的每行语句,分别采用所述第一正则表达式、所述第三正则表达式和所述第四正则表达式对该行语句进行匹配,确定该行语句的类型;
针对类型为表名所在行的语句,通过所述第二正则表达式对该语句进行匹配,确定所述表名所在位置。
在一种可能的实施方式中,所述预置的正则表达式还包括用于匹配所述索引行中索引字段所在位置的第五正则表达式;
针对所述第一建表语句的每行语句,分别采用所述第一正则表达式、所述第三正则表达式和所述第四正则表达式对该行语句进行匹配,确定该行语句的类型之后,所述方法还包括:
针对类型为索引行的语句,通过所述第五正则表达式对该语句进行匹配,确定所述索引字段所在位置。
按照预设的第二分表命名规则,将所述索引字段所在位置的字段替换为所述第一数据表的第一分表的索引字段。
在一种可能的实施方式中,所述表名所在行为所述第一建表语句的首行。
在一种可能的实施方式中,输出各个第二建表语句,包括:
将所有第二建表语句写入同一目标文件中;
将所述目标文件存储到预置的,或用户配置的存储路径。
在一种可能的实施方式中,所述获取第一数据表的第一建表语句,包括:
获取用户在配置界面上选择上传的源文件,其中,所述源文件中包含所述第一建表语句;
从所述源文件中提取所述第一建表语句。
在一种可能的实施方式中,通过预置的正则表达式,对所述第一建表语句中所述第一数据表的表名进行修改,生成数量为所述分表数量的第二建表语句,之前,所述方法还包括:
获取用户在所述配置界面上输入的配置信息,其中,所述配置信息包括以下中的至少一种:分表命名规则、表征是否对索引行中的索引字段进行替换的指示信息、目标文件的存储路径;
所述匹配模块,具体用于:
根据预置的正则表达式和所述配置信息,对所述第一建表语句中所述第一数据表的表名进行修改,生成数量为所述分表数量的第二建表语句。
在一种可能的实施方式中,输出各个第二建表语句之后,所述方法还包括:
显示各个第二建表语句。
在一种可能的实施方式中,输出各个第二建表语句之后,所述方法还包括:
根据各个第二建表语句,生成创建第一数据表的分表的建表脚本,并在数据库中执行所述建表脚本,得到所述第一数据表的所述分表数量的分表。
第二方面,本发明实施例提供一种建表语句生成装置,包括:
获取模块,用于获取第一数据表的第一建表语句和用户输入的分表数量;
匹配模块,用于通过预置的正则表达式,对所述第一建表语句中所述第一数据表的表名进行修改,生成数量为所述分表数量的第二建表语句,其中,每个第二建表语句用于生成所述第一数据表的一个分表;
输出模块,用于输出各个第二建表语句。
在一种可能的实施方式中,所述预置的正则表达式包括用于匹配所述第一建表语句中表名所在行的第一正则表达式,和用于匹配所述表名所在行中的表名所在位置的第二正则表达式。
在一种可能的实施方式中,所述匹配模块,具体用于:
提取所述第一建表语句的各行语句,并通过所述第一正则表达式和所述第二正则表达式,确定所述第一建表语句中的表名所在行的表名所在位置;
按照预设的第一分表命名规则,将所述表名所在位置的字段替换为所述第一数据表的第一分表的表名,得到所述第一表名对应的第二建表语句,其中,所述第一分表为当前所生成的建表语句对应的分表;
若当前已生成的第二建表语句的数量小于所述分表数量,则跳转执行以下步骤:提取所述第一建表语句的各行语句,并通过所述第一正则表达式和所述第二正则表达式,确定所述第一建表语句中的表名所在行的表名所在位置。
在一种可能的实施方式中,所述匹配模块,具体用于:
提取所述第一建表语句中的各行语句,并将所述第一正则表达式分别与所述第一建表语句中的各行语句进行匹配,确定所述表名所在行;
通过所述第二正则表达式对所述表名所在行进行匹配,确定所述表名所在位置。
在一种可能的实施方式中,所述第一建表语句中的语句的类型包括以下四种:表名所在行、普通行、索引行、尾行;
所述预置的正则表达式还包括用于匹配所述第一建表语句中索引行的第三正则表达式,和用于匹配所述第一建表语句中的尾行的第四正则表达式;
所述匹配模块,具体用于:
依次提取所述第一建表语句的各行语句;
针对所述第一建表语句的每行语句,分别采用所述第一正则表达式、所述第三正则表达式和所述第四正则表达式对该行语句进行匹配,确定该行语句的类型;
针对类型为表名所在行的语句,通过所述第二正则表达式对该语句进行匹配,确定所述表名所在位置。
在一种可能的实施方式中,所述预置的正则表达式还包括用于匹配所述索引行中索引字段所在位置的第五正则表达式;
所述匹配模块,还用于:
针对类型为索引行的语句,通过所述第五正则表达式对该语句进行匹配,确定所述索引字段所在位置。
按照预设的第二分表命名规则,将所述索引字段所在位置的字段替换为所述第一数据表的第一分表的索引字段。
在一种可能的实施方式中,所述表名所在行为所述第一建表语句的首行。
在一种可能的实施方式中,所述输出模块,具体用于:
将所有第二建表语句写入同一目标文件中;
将所述目标文件存储到预置的,或用户配置的存储路径。
在一种可能的实施方式中,所述获取模块,具体用于:
获取用户在配置界面上选择上传的源文件,其中,所述源文件中包含所述第一建表语句;
从所述源文件中提取所述第一建表语句。
在一种可能的实施方式中,所述获取模块,还用于:
获取用户在所述配置界面上输入的配置信息,其中,所述配置信息包括以下中的至少一种:分表命名规则、表征是否对索引行中的索引字段进行替换的指示信息、目标文件的存储路径;
所述匹配模块,具体用于:
根据预置的正则表达式和所述配置信息,对所述第一建表语句中所述第一数据表的表名进行修改,生成数量为所述分表数量的第二建表语句。
在一种可能的实施方式中,所述装置还包括显示模块,所述显示模块用于:
显示各个第二建表语句。
在一种可能的实施方式中,所述装置还包括创建模块,所述创建模块用于:
根据各个第二建表语句,生成创建第一数据表的分表的建表脚本,并在数据库中执行所述建表脚本,得到所述第一数据表的所述分表数量的分表。
第三方面,本发明实施例提供一种建表语句生成设备,包括:至少一个处理器和存储器;
所述存储器存储计算机执行指令;
所述至少一个处理器执行所述存储器存储的计算机执行指令,使得所述至少一个处理器执行如上第一方面以及第一方面各种可能的实施方式所述的建表语句生成方法。
第四方面,本发明实施例提供一种计算机可读存储介质,所述计算机可读存储介质中存储有计算机执行指令,当处理器执行所述计算机执行指令时,实现如上第一方面以及第一方面各种可能的实施方式所述的建表语句生成方法。
本发明实施例提供的建表语句生成方法、装置、设备及存储介质,通过获取第一数据表的第一建表语句和用户输入的分表数量;通过预置的正则表达式,对第一建表语句中第一数据表的表名进行修改,生成数量为该分表数量的第二建表语句,其中,每个第二建表语句用于生成第一数据表的一个分表;输出各个第二建表语句,能够通过正则表达式实现对建表语句中表名的匹配和替换,从而自动高效的生成数据表的分表的建表语句,提高建表语句的生成效率。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作一简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
图1为本发明一实施例提供的建表语句生成方法的流程示意图;
图2为本发明实施例提供的配置界面的示意图;
图3为本发明又一实施例提供的建表语句生成方法的流程示意图;
图4为本发明另一实施例提供的建表语句生成方法的流程示意图;
图5为本发明再一实施例提供的建表语句生成方法的流程示意图;
图6为本发明一实施例提供的建表语句生成装置的结构示意图;
图7为本发明又一实施例提供的建表语句生成装置的结构示意图;
图8为本发明一实施例提供的建表语句生成设备的硬件结构示意图。
具体实施方式
为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
数据表是数据库中存储数据的文件。建表语句是用于建立数据表的语句。建表语句中可以包括一个数据表的名称、字段、类型、主键、外键和索引等。随着数据量的增加,单个数据表的模式已不满足数据的存储需求,因此需要将数据均匀地拆分为多个分表进行存放。在数据拆分存放之前,首先需要编辑分表的建表语句,以便通过建表语句进行分表的创建。现有技术中,在进行分表的建表语句编辑时,是在单个数据表的建表语句的基础上,以人工的方式对建表语句进行复制和修改,从而形成各个分表的建表语句。然而现有技术中,由于每个分表的建表语句都需要人工进行复制和修改,当分表数量较大时,分表的建表语句的生成效率较低。
本发明实施例能够通过正则表达式实现对建表语句中表名的匹配和替换,从而自动高效的生成数据表的分表的建表语句,提高建表语句的生成效率,并且可以避免由于人工复制修改导致的易出错问题,同时降低人工成本。
图1为本发明一实施例提供的建表语句生成方法的流程示意图。如图1所示,该方法包括:
S101、获取第一数据表的第一建表语句和用户输入的分表数量。
本实施例中,第一建表语句为第一数据表的建表语句。在数据库中执行该第一建表语句可以生成第一数据表。用户需要创建第一数据表的分表时,可以向设备输入第一建表语句和分表数量。其中,设备为上述方法的执行主体,该设备可以为笔记本、台式计算机、平板等,在此不作限定。分表数量是用户需要创建的分表的总数,例如,用户需要创建256个分表,则可以向该设备输入分表数量为256。
可选地,S101可以包括:
获取用户在配置界面上选择上传的源文件,其中,所述源文件中包含所述第一建表语句;
从所述源文件中提取所述第一建表语句。
本实施例中,该设备可以包括显示屏,该设备可以在显示屏上显示配置界面。配置界面上包括用于用户上传源文件的第一控件和用于用户输入分表数量的第二控件。如图2所示为本发明实施例提供的配置界面的示意图。参照图2,配置界面20除了包含第一控件21和第二控件22之外,还可以包括显示是否成功生成分表建表语句的提示窗口23,以及控制开始执行的开始控件24。该设备在接收到用户通过第一控件上传的源文件后,可以从源文件中提取出第一建表语句。
S102、通过预置的正则表达式,对所述第一建表语句中所述第一数据表的表名进行修改,生成数量为所述分表数量的第二建表语句,其中,每个第二建表语句用于生成所述第一数据表的一个分表。
本实施例中,第二建表语句为第一数据表的分表的建表语句。预置的正则表达式可以为默认的正则表达式,也可以为用户预先配置的正则表达式,在此不作限定。通过正则表达式可以匹配第一建表语句中的第一数据表的表名。由于本实施例提供的方法是要生成第一数据表的分表的建表语句,而每个分表拥有不同于第一数据表的表名,分表的建表语句与第一数据表的建表语句中的表名不相同。因此,可以通过正则表达式匹配出第一建表语句中的表名所在位置,并将第一建表语句中的表名进行替换,从而生成第一数据表的一个分表。经过多次匹配和替换,则可以生成上述分表数量的分表的建表语句。
可选地,预置的正则表达式可以包括用于匹配第一建表语句中表名所在行的第一正则表达式,和用于匹配所述表名所在行中的表名所在位置的第二正则表达式。
本实施例中,预置的正则表达式可以包括至少两个:第一正则表达式和第二正则表达式。在匹配过程中,首先通过第一正则表达式对第一建表语句进行匹配,可以匹配得到第一建表语句中的表名所在行,然后通过第二正则表达式对第一建表语句中的表名所在行进行匹配,可以匹配得到第一建表语句中的表名所在位置。
其中,表名所在行位于第一建表语句中的哪一行并不确定,不同数据库中数据表的建表语句的格式不同,相应的,表名所在行也可能不同,因此首先通过第一正则表达式匹配确定第一建表语句中的表名所在行。例如,若第一数据表为SQL(Structured QueryLanguage)数据库中的数据表,则建表语句中的表名所在行为第一建表语句的首行。为便于说明,下面给出一个建表语句的示例,如下:
1 CREATE TABLE`payment_info`(
2 `id`bigint(20)NOT NULL AUTO_INCREMENT COMMENT’主键’,
3 `pin`varchar(100)DEFAULT NULL COMMENT’用户pin’,
4 `pay_id`varchar(100)DEFAULT NULL COMMENT’支付单号’,
5 `rebate_status`int(11)DEFAULT NULL COMMENT’返现状态(1:未返现,3:反现成功,6:返现失败)’,
6 `calc_identity`varchar(10)DEFAULT NULL COMMENT,’返现计算标识(1:已计算,0:未计算)’,
7`createtd_date`datetime DEFAULT NULL COMMENT’创建时间’,
8 `modifietd_date`datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ONUPDATE CURRENT.TIMESrAMP COMMENT,’更新时间’,
9 `yn`int(4)DEFAULT NULL COMMENT’记录有效(0:无效,1:有效)’,
10 `df`int(4)DEFAULT 0COMMENT’删除标记’,
11 `vn`int(11)DEFAULT 0COMMENT’版本号’,
12 PRIMARY KEY(`id`),
13 UNIQUE KEY`uniq_payment_pin_pay_id`(`pin`,`pay_id`)
14 KEY`idx_payment_pin`(`pin`),
15 KEY`idx_payment_rebate_status`(`rebate_status`),
16 KEY`idx_payment_calc_identity`(`calc_identity`),
17 KEY`idx_payment_createtd_date`(`createtd_date`),
18 KEY`idx_payment_yn`(`yn`),
19)ENGINE=InnoDB AUT0_INCREMENT=1DEFAULT CHARSET=utf8C0LLATB=utf8_bin COMMENT=’支付信息表’;
该示例中,第一数据表的表名为“payment_info”,位于第一建表语句的第1行。
针对上述示例,第一正则表达式可以定义如下:
Private static final String CREATE_TABLE_EXPRESSION=”\\s*((CREATE)\\s+(TABLE)\\s+)`[A-Za-z][A-Za-z0-9_]+`\\s*[(]$”;
其中,第一正则表达式为”\\s*((CREATE)\\s+(TABLE)\\s+)`[A-Za-z][A-Za-z0-9_]+`\\s*[(]$”。
第二正则表达式可以定义如下:
Private static final String REPLACE_TABLE_EXPRESSION=”\\`[A-Za-z][A-Za-z0-9_]+`\\s*[(]”
其中,第二正则表达式为”\\`[A-Za-z][A-Za-z0-9_]+`\\s*[(]”。
S103、输出各个第二建表语句。
在本实施例中,可以将每个第二建表语句分别写入到不同的目标文件中进行输出;也可以将所有第二建表语句都写入同一目标文件中。然后将目标文件存储到预置的,或用户配置的存储路径,以便用户可以从该存储路径中读取目标文件,将目标文件中的第二建表语句生成数据库可执行的文件,或者直接复制到数据库的代码运行窗口中运行。其中,在将所有第二建表语句都写入同一目标文件时,可以每生成一个第二建表语句,就将该第二建表语句写入到目标文件中;也可以在生成所有第二建表语句后,一次性将所有建表语句写入到目标文件中,在此不作限定。
本发明实施例通过获取第一数据表的第一建表语句和用户输入的分表数量;通过预置的正则表达式,对第一建表语句中第一数据表的表名进行修改,生成数量为该分表数量的第二建表语句,其中,每个第二建表语句用于生成第一数据表的一个分表;输出各个第二建表语句,能够通过正则表达式实现对建表语句中表名的匹配和替换,从而自动高效的生成数据表的分表的建表语句,提高建表语句的生成效率,并且可以避免由于人工复制修改导致的易出错问题,同时降低人工成本。
可选地,S103之后,上述方法还可以包括:
显示各个第二建表语句。
本实施例中,可以在配置界面或者其他预设的显示界面上显示各个第二建表语句,以便用户查看生成的第二建表语句。
可选地,S103之后,上述方法还可以包括:
根据各个第二建表语句,生成创建第一数据表的分表的建表脚本,并在数据库中执行所述建表脚本,得到所述第一数据表的所述分表数量的分表。
本实施例中,该设备在生成各个第二建表语句后,可以直接根据各个第二建表语句生成建表脚本。在数据库中执行该建表脚本可以创建第一数据表的分表,所创建出的分表的数量即为用户所设置的分表数量。可以通过建表脚本实现对第一数据表的分表的创建。
图3为本发明又一实施例提供的建表语句生成方法的流程示意图。本实施例对通过预置的正则表达式对第一建表语句中第一数据表的表名进行修改的具体实现过程进行了详细说明。如图3所示,该方法包括:
S301、获取第一数据表的第一建表语句和用户输入的分表数量。
本实施例中的S301与图1实施例中的S101类似,此处不再赘述。
S302、提取所述第一建表语句的各行语句,并通过所述第一正则表达式和所述第二正则表达式,确定所述第一建表语句中的表名所在行的表名所在位置。
本实施例中,可以以循环的方式多次执行S302至S304,直到生成的第二建表语句的数量达到上述分表数量则停止循环,一次循环过程可以生成一个第二建表语句。在一次循环过程中,首先从第一建表语句中提取出其中的各行语句,通过第一正则表达式和第二正则表达式确定出第一建表语句中的表名所在行的表名所在位置,然后将该表名所在位置的字段替换为该次循环中所需生成的分表的表名。可选地,S302可以通过以下两种实现方式中的任一种来实现,下面分别进行说明。
在第一种实现方式中,S302可以包括:
提取所述第一建表语句中的各行语句,并将所述第一正则表达式分别与所述第一建表语句中的各行语句进行匹配,确定所述表名所在行;
通过所述第二正则表达式对所述表名所在行进行匹配,确定所述表名所在位置。
该实现方式中,在提取到第一建表语句的各行语句之后,将第一正则表达式依次分别与各行语句进行匹配,确定出表名所在行。例如,可以按照行号依次将第一正则表达式与各行语句匹配。在确定出表名所在行之后,针对表名所在行采用第二正则表达式匹配,确定出该行中的表名所在位置。
在第二种实现方式中,所述第一建表语句中的语句的类型包括以下四种:表名所在行、普通行、索引行、尾行;
所述预置的正则表达式还包括用于匹配所述第一建表语句中索引行的第三正则表达式,和用于匹配所述第一建表语句中的尾行的第四正则表达式;
S302可以包括:
提取所述第一建表语句的各行语句,并通过所述第一正则表达式和所述第二正则表达式,确定所述第一建表语句中的表名所在行的表名所在位置,包括:
依次提取所述第一建表语句的各行语句;
针对所述第一建表语句的每行语句,分别采用所述第一正则表达式、所述第三正则表达式和所述第四正则表达式对该行语句进行匹配,确定该行语句的类型;
针对类型为表名所在行的语句,通过所述第二正则表达式对该语句进行匹配,确定所述表名所在位置。
该实现方式中,第一建表语句中的语句的类型包括四种,分别是表名所在行、普通行、索引行、尾行。其中,表名所在行是指表名所在的行,如上述示例中的第1行。普通行是指定义数据表的表项的行,如上述示例中的第2-12行。索引行是指定义数据表的索引的行,如上述示例中的第13-18行。尾行是指最后一行,如上述示例中的第19行。表名所在行对应于第一正则表达式,索引行对应于第三正则表达式,尾行对应于第四正则表达式。
针对上述示例,第三正则表达式可以定义如下:
Private static final String INDEX_EXPRESSION=”^\\s*((UNIQUE)?\\s?(KEY)\\s+)`[A-Za-z][A-Za-z0-9_]+`\\s*[(]`[A-Za-z][A-Za-z0-9_`]*`[)]”;
其中,第三正则表达式为”^\\s*((UNIQUE)?\\s?(KEY)\\s+)`[A-Za-z][A-Za-z0-9_]+`\\s*[(]`[A-Za-z][A-Za-z0-9_`]*`[)]”。
第四正则表达式可以以尾行中“)”的进行匹配,容易确定,在此不再赘述。
该实现方式中,针对第一建表语句中的每行语句,通过第一正则表达式、第三正则表达式、第四正则表达式识别出该行语句的类型;若匹配成功,则根据与该行语句匹配的正则表达式确定出该行语句的类型,若匹配全部失败,则确定该行语句的类型为普通行。进而确定第一建表语句中各行语句的类型,然后对其中类型为表名所在行的语句采用第二正则表达式匹配出表名所在位置。
S303、按照预设的第一分表命名规则,将所述表名所在位置的字段替换为所述第一数据表的第一分表的表名,得到所述第一表名对应的第二建表语句,其中,所述第一分表为当前所生成的建表语句对应的分表。
本实施例中,预设的第一分表命令规则可以为默认的命名规则,或者由用户配置的命名规则。例如,第一分表命名规则可以是在表名末尾添加下划线和数字,形成分表的表名,针对上述示例,第一数据表的表名为“payment_info”,则第一数据表的分表的表名可以依次为payment_info_0,payment_info_1,payment_info_2,……,payment_info_N,其中N为用户配置的分表数量。根据第一分表命名规则可以确定出每次循环过程中所要生成的建表语句对应的分表的表名。
S304、若当前已生成的第二建表语句的数量小于所述分表数量,则跳转执行步骤S302。
本实施例中,以当前已生成的第二建表语句的数量判断是否结束循环。若当前已生成的第二建表语句的数量小于用户配置的分表数量,则跳转执行步骤S302,继续生成下一分表;若当前已生成的第二建表语句的数量等于用户配置的分表数量,则结束循环,执行S305。
S305、输出各个第二建表语句。
本实施例中,S305与图1实施例中的S103类似,此处不再赘述。
在通过正则表达式确定表名所在位置时,若第一建表语句中除表名所在行之外的其他行还包含与表名相同的字段,存在将该字段错误匹配为表名所在位置的可能,这样会导致表名替换错误,得到错误的建表语句。为避免该问题,本实施例通过第一正则表达式先确定出第一建表语句中的表名所在行,然后再通过第二正则表达式对表名所在行进行匹配确定表名所在位置。本实施例第二正则表达式只针对表名所在行进行匹配,在其他行也存在与表名相同的字段时,不会错误匹配到其他行,依然能准确匹配出表名所在位置,从而提高生成建表语句的准确率。
图4为本发明另一实施例提供的建表语句生成方法的流程示意图。本实施例中所述预置的正则表达式还包括用于匹配所述索引行中索引字段所在位置的第五正则表达式,如图4所示,该方法包括:
S401、获取第一数据表的第一建表语句和用户输入的分表数量。
本实施例中,S401与图1实施例中的S101类似,此处不再赘述。
S402、依次提取所述第一建表语句的各行语句。
S403、针对所述第一建表语句的每行语句,分别采用所述第一正则表达式、所述第三正则表达式和所述第四正则表达式对该行语句进行匹配,确定该行语句的类型。
本实施例中,S402、S403、S405与图1实施例中的S302的第二种实现方式类似,此处不再赘述。
S404、针对类型为索引行的语句,通过所述第五正则表达式对该语句进行匹配,确定所述索引字段所在位置。
本实施例中,索引字段为建表语句中定义索引名称的字段。通过第三正则表达式可以匹配确定第一建表语句中的索引行,然后采用第五正则表达式的对索引行进行匹配,可以确定出索引行中索引所在的位置。如在上述示例中第13-18行为索引行,其中“uniq_payment_pin_pay_id”、“idx_payment_pin”、“idx_payment_rebate_status”、“idx_payment_calc_identity”、“idx_payment_createtd_date”、“idx_payment_yn”均为索引字段。针对该示例,第五正则表达式的形式可以为\\`[A-Za-z][A-Za-z0-9_]+`\\s*[(],与第一正则表达式的形式相同。第五正则表达式可以与第一正则表达式为同一表达式,也可以为不同的表达式,在此不作限定。
S405、针对类型为表名所在行的语句,通过所述第二正则表达式对该语句进行匹配,确定所述表名所在位置。
S406、按照预设的第一分表命名规则,将所述表名所在位置的字段替换为所述第一数据表的第一分表的表名,并按照预设的第二分表命名规则,将所述索引字段所在位置的字段替换为所述第一数据表的第一分表的索引字段,得到所述第一表名对应的第二建表语句,其中,所述第一分表为当前所生成的建表语句对应的分表。
本实施例中,第一分表命令规则为确定分表的表名的规则,第二分表命令规则为确定分表的索引名的规则。第一分表命名规则和第二分表命名规则可以相同,也可以不同,在此不作限定。例如,第一分表命名规则和第二分表命名规则可以均为在名称末尾增加下划线和数字的方式形成新的名称。
本实施例中生成第一数据表的分表的建表语句时,不仅修改建表语句中的表名,还修改建表语句中的索引名,使所创建的每个分表有拥有不同的索引名,从而避免不同数据表之间索引的影响。例如,针对上述的第一建表语句的示例,经过表名和索引名替换后形成的某个分表的示例如下:
1 CREATE TABLE`payment_info_0`(
2 `id`bigint(20)NOT NULL AUTO_INCREMENT COMMENT’主键’,
3`pin`varchar(100)DEFAULT NULL COMMENT’用户pin’,
4 `pay_id`varchar(100)DEFAULT NULL COMMENT’支付单号’,
5 `rebate_status`int(11)DEFAULT NULL COMMENT’返现状态(1:未返现,3:反现成功,6:返现失败)’,
6 `calc_identity`varchar(10)DEFAULT NULL COMMENT,’返现计算标识(1:已计算,0:未计算)’,
7 `createtd_date`datetime DEFAULT NULL COMMENT’创建时间’,
8 `modifietd_date`datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ONUPDATE CURRENT.TIMESrAMP COMMENT,’更新时间’,
9 `yn`int(4)DEFAULT NULL COMMENT’记录有效(0:无效,1:有效)’,
10 `df`int(4)DEFAULT 0COMMENT’删除标记’,
11 `vn`int(11)DEFAULT 0COMMENT’版本号’,
12 PRIMARY KEY(`id`),
13 UNIQUE KEY`uniq_payment_pin_pay_id_0`(`pin`,`pay_id`)
14 KEY`idx_payment_pin_0`(`pin`),
15 KEY`idx_payment_rebate_status_0`(`rebate_status`),
16 KEY`idx_payment_calc_identity_0`(`calc_identity`),
17 KEY`idx_payment_createtd_date_0`(`createtd_date`),
18 KEY`idx_payment_yn_0`(`yn`),
19 )ENGINE=InnoDB AUT0_INCREMENT=1DEFAULT CHARSET=utf8C0LLATB=utf8_bin COMMENT=’支付信息表’;
可以看出,第1行中的表名,以及第13-18行中的索引字段均已替换为分表的表名以及索引字段。该分表的表名为“payment_info_0”。
S407、若当前已生成的第二建表语句的数量小于所述分表数量,则跳转执行步骤S402。
本实施例中,S407与图3实施例中的S303类似,此处不再赘述。
S408、输出各个第二建表语句。
本实施例中,S408与图1实施例中的S103类似,此处不再赘述。
本实施例通过第五正则表达式匹配确定第一建表语句中的索引行的索引字段,能够在对第一建表语句中分表的表名进行修改的同时,还能对第一建表语句中的索引字段进行修改,使生成的建表语句创建出的分表的索引与第一数据表、其他分表的索引均不相同,防止不同数据表之间索引的相互影响。
图5为本发明再一实施例提供的建表语句生成方法的流程示意图。本实施例对获取第一数据表的第一建表语句和用户输入的分表数量的具体实现过程进行了详细说明。如图5所示,该方法包括:
S501,获取用户在配置界面上选择上传的源文件,其中,所述源文件中包含所述第一建表语句。
S502,从所述源文件中提取所述第一建表语句。
S503,获取用户在所述配置界面上输入的配置信息,其中,所述配置信息包括以下中的至少一种:分表命名规则、表征是否对索引行中的索引字段进行替换的指示信息、目标文件的存储路径。
本实施例中,配置界面上除包含用于用户上传源文件的第一控件和用于用户输入分表数量的第二控件之外,还可以包括用于用户输入分表命名规则的第三控件、用于用户输入表征是否对索引行中的索引字段进行替换的指示信息的第四控件、以及用于用户配置目标文件的存储路径的第四控件中的至少一个。用户可以根据需求进行配置,如通过第三控件设置分表命名规则,通过第四控件设置是否进行索引字段的替换,通过第五控件设置目标文件的存储路径。
S504、根据预置的正则表达式和所述配置信息,对所述第一建表语句中所述第一数据表的表名进行修改,生成数量为所述分表数量的第二建表语句。
S505,输出各个第二建表语句。
本实施例中通过提供配置界面,便于用户根据需求设置分表命名规则、是否对索引行中的索引字段进行替换、以及目标文件的存储路径等信息,便于用户对建表语句的生成过程进行相应的设置,提高操作的便捷性。
图6为本发明一实施例提供的建表语句生成装置的结构示意图。如图6所示,该建表语句生成装置60包括:获取模块601、匹配模块602、输出模块603。
获取模块601,用于获取第一数据表的第一建表语句和用户输入的分表数量。
匹配模块602,用于通过预置的正则表达式,对所述第一建表语句中所述第一数据表的表名进行修改,生成数量为所述分表数量的第二建表语句,其中,每个第二建表语句用于生成所述第一数据表的一个分表。
输出模块603,用于输出各个第二建表语句。
本发明实施例中获取模块获取第一数据表的第一建表语句和用户输入的分表数量;匹配模块通过预置的正则表达式,对第一建表语句中第一数据表的表名进行修改,生成数量为该分表数量的第二建表语句,其中,每个第二建表语句用于生成第一数据表的一个分表;输出模块输出各个第二建表语句,能够通过正则表达式实现对建表语句中表名的匹配和替换,从而自动高效的生成数据表的分表的建表语句,提高建表语句的生成效率,并且可以避免由于人工复制修改导致的易出错问题,同时降低人工成本。
图7为本发明又一实施例提供的建表语句生成装置的结构示意图。如图7所示,本实施例提供的建表语句生成装置60在图6所示实施例提供的建表语句生成装置的基础上,还可以包括:显示模块604、创建模块605。
可选地,所述预置的正则表达式包括用于匹配所述第一建表语句中表名所在行的第一正则表达式,和用于匹配所述表名所在行中的表名所在位置的第二正则表达式。
可选地,所述匹配模块602,具体用于:
提取所述第一建表语句的各行语句,并通过所述第一正则表达式和所述第二正则表达式,确定所述第一建表语句中的表名所在行的表名所在位置;
按照预设的第一分表命名规则,将所述表名所在位置的字段替换为所述第一数据表的第一分表的表名,得到所述第一表名对应的第二建表语句,其中,所述第一分表为当前所生成的建表语句对应的分表;
若当前已生成的第二建表语句的数量小于所述分表数量,则跳转执行以下步骤:提取所述第一建表语句的各行语句,并通过所述第一正则表达式和所述第二正则表达式,确定所述第一建表语句中的表名所在行的表名所在位置。
可选地,所述匹配模块602,具体用于:
提取所述第一建表语句中的各行语句,并将所述第一正则表达式分别与所述第一建表语句中的各行语句进行匹配,确定所述表名所在行;
通过所述第二正则表达式对所述表名所在行进行匹配,确定所述表名所在位置。
可选地,所述第一建表语句中的语句的类型包括以下四种:表名所在行、普通行、索引行、尾行;
所述预置的正则表达式还包括用于匹配所述第一建表语句中索引行的第三正则表达式,和用于匹配所述第一建表语句中的尾行的第四正则表达式;
所述匹配模块602,具体用于:
依次提取所述第一建表语句的各行语句;
针对所述第一建表语句的每行语句,分别采用所述第一正则表达式、所述第三正则表达式和所述第四正则表达式对该行语句进行匹配,确定该行语句的类型;
针对类型为表名所在行的语句,通过所述第二正则表达式对该语句进行匹配,确定所述表名所在位置。
可选地,所述预置的正则表达式还包括用于匹配所述索引行中索引字段所在位置的第五正则表达式;
所述匹配模块602,还用于:
针对类型为索引行的语句,通过所述第五正则表达式对该语句进行匹配,确定所述索引字段所在位置。
按照预设的第二分表命名规则,将所述索引字段所在位置的字段替换为所述第一数据表的第一分表的索引字段。
可选地,所述表名所在行为所述第一建表语句的首行。
可选地,所述输出模块603,具体用于:
将所有第二建表语句写入同一目标文件中;
将所述目标文件存储到预置的,或用户配置的存储路径。
可选地,所述获取模块601,具体用于:
获取用户在配置界面上选择上传的源文件,其中,所述源文件中包含所述第一建表语句;
从所述源文件中提取所述第一建表语句。
可选地,所述获取模块,还用于:
获取用户在所述配置界面上输入的配置信息,其中,所述配置信息包括以下中的至少一种:分表命名规则、表征是否对索引行中的索引字段进行替换的指示信息、目标文件的存储路径;
所述匹配模块602,具体用于:
根据预置的正则表达式和所述配置信息,对所述第一建表语句中所述第一数据表的表名进行修改,生成数量为所述分表数量的第二建表语句。
可选地,所述显示模块604,用于:
显示各个第二建表语句。
可选地,所述创建模块605,用于:
根据各个第二建表语句,生成创建第一数据表的分表的建表脚本,并在数据库中执行所述建表脚本,得到所述第一数据表的所述分表数量的分表。
本发明实施例提供的建表语句生成装置,可用于执行上述的方法实施例,其实现原理和技术效果类似,本实施例此处不再赘述。
图8为本发明一实施例提供的建表语句生成设备的硬件结构示意图。如图8所示,本实施例提供的建表语句生成设备80包括:至少一个处理器801和存储器802。该建表语句生成设备80还包括通信部件803。其中,处理器801、存储器802以及通信部件803通过总线804连接。
在具体实现过程中,至少一个处理器801执行所述存储器802存储的计算机执行指令,使得至少一个处理器801执行如上的建表语句生成方法。
处理器801的具体实现过程可参见上述方法实施例,其实现原理和技术效果类似,本实施例此处不再赘述。
在上述的图8所示的实施例中,应理解,处理器可以是中央处理单元(英文:Central Processing Unit,简称:CPU),还可以是其他通用处理器、数字信号处理器(英文:Digital Signal Processor,简称:DSP)、专用集成电路(英文:Application SpecificIntegrated Circuit,简称:ASIC)等。通用处理器可以是微处理器或者该处理器也可以是任何常规的处理器等。结合发明所公开的方法的步骤可以直接体现为硬件处理器执行完成,或者用处理器中的硬件及软件模块组合执行完成。
存储器可能包含高速RAM存储器,也可能还包括非易失性存储NVM,例如至少一个磁盘存储器。
总线可以是工业标准体系结构(Industry Standard Architecture,ISA)总线、外部设备互连(Peripheral Component Interconnect,PCI)总线或扩展工业标准体系结构(Extended Industry Standard Architecture,EISA)总线等。总线可以分为地址总线、数据总线、控制总线等。为便于表示,本申请附图中的总线并不限定仅有一根总线或一种类型的总线。
本申请还提供一种计算机可读存储介质,所述计算机可读存储介质中存储有计算机执行指令,当处理器执行所述计算机执行指令时,实现如上的建表语句生成方法。
上述的计算机可读存储介质,上述可读存储介质可以是由任何类型的易失性或非易失性存储设备或者它们的组合实现,如静态随机存取存储器(SRAM),电可擦除可编程只读存储器(EEPROM),可擦除可编程只读存储器(EPROM),可编程只读存储器(PROM),只读存储器(ROM),磁存储器,快闪存储器,磁盘或光盘。可读存储介质可以是通用或专用计算机能够存取的任何可用介质。
一种示例性的可读存储介质耦合至处理器,从而使处理器能够从该可读存储介质读取信息,且可向该可读存储介质写入信息。当然,可读存储介质也可以是处理器的组成部分。处理器和可读存储介质可以位于专用集成电路(Application Specific IntegratedCircuits,简称:ASIC)中。当然,处理器和可读存储介质也可以作为分立组件存在于设备中。
最后应说明的是:以上各实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述各实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分或者全部技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的范围。