技术领域
[0001] 本公开涉及大数据技术领域,尤其涉及数据库存储函数生成方法、装置、电子设备和程序产品。
相关背景技术
[0002] 随着大数据技术领域的快速发展,数据工程师在分析和处理数据集时,通常要把用Python(Python编程语言)和pandas库(pandas数据分析库)编写的数据分析程序转化为适用于数据库的数据库存储函数。这时,数据工程师需要将Python编写的数据分析脚本转化为数据库存储函数。
[0003] 相关技术中,通常采用人工编码的方式将Python数据分析脚本转换为数据库存储函数(Structured Query Language,SQL)。数据工程师需要在理解Python数据分析脚本的代码逻辑后,重新编写相应的SQL。然而,人工编码的方式不仅要求开发人员熟练掌握Python和pandas库,还需要了解特定数据库的操作方式和SQL特点,这会耗费数据工程师大量的时间和精力,导致数据库存储函数的转换效率低下。
具体实施方式
[0026] 下面将参照附图更详细地描述本公开的实施例。虽然附图中显示了本公开的某些实施例,然而应当理解的是,本公开可以通过各种形式来实现,而且不应该被解释为限于这里阐述的实施例,相反提供这些实施例是为了更加透彻和完整地理解本公开。应当理解的是,本公开的附图及实施例仅用于示例性作用,并非用于限制本公开的保护范围。
[0027] 应当理解,本公开的方法实施方式中记载的各个步骤可以按照不同的顺序执行,和/或并行执行。此外,方法实施方式可以包括附加的步骤和/或省略执行示出的步骤。本公开的范围在此方面不受限制。
[0028] 本文使用的术语“包括”及其变形是开放性包括,即“包括但不限于”。术语“基于”是“至少部分地基于”。术语“一个实施例”表示“至少一个实施例”;术语“另一实施例”表示“至少一个另外的实施例”;术语“一些实施例”表示“至少一些实施例”。其他术语的相关定义将在下文描述中给出。需要注意,本公开中提及的“第一”、“第二”等概念仅用于对不同的装置、模块或单元进行区分,并非用于限定这些装置、模块或单元所执行的功能的顺序或者相互依存关系。
[0029] 需要注意,本公开中提及的“一个”、“多个”的修饰是示意性而非限制性的,本领域技术人员应当理解,除非在上下文另有明确指出,否则应该理解为“一个或多个”。
[0030] 本公开实施方式中的多个装置之间所交互的消息或者信息的名称仅用于说明性的目的,而并不是用于对这些消息或信息的范围进行限制。
[0031] 可以理解的是,在使用本公开各实施例公开的技术方案之前,均应当依据相关法律法规通过恰当的方式对本公开所涉及个人信息的类型、使用范围、使用场景等告知用户并获得用户的授权。
[0032] 例如,在响应于接收到用户的主动请求时,向用户发送提示信息,以明确地提示用户,其请求执行的操作将需要获取和使用到用户的个人信息。从而,使得用户可以根据提示信息来自主地选择是否向执行本公开技术方案的操作的电子设备、应用程序、服务器或存储介质等软件或硬件提供个人信息。
[0033] 作为一种可选的但非限定性的实现方式,响应于接收到用户的主动请求,向用户发送提示信息的方式例如可以是弹窗的方式,弹窗中可以以文字的方式呈现提示信息。此外,弹窗中还可以承载供用户选择“同意”或者“不同意”向电子设备提供个人信息的选择控件。可以理解的是,上述通知和获取用户授权过程仅是示意性的,不对本公开的实现方式构成限定,其它满足相关法律法规的方式也可应用于本公开的实现方式中。
[0034] 随着大数据技术领域的快速发展,数据工程师在分析和处理数据集时,通常要把用Python和pandas库编写的数据分析程序转化为适用于数据库的数据库存储函数。这时,数据工程师需要将Python编写的数据分析脚本转化为数据库存储函数。
[0035] 相关技术中,通常采用人工编码的方式将Python数据分析脚本转换为数据库存储函数。数据工程师需要在理解Python数据分析脚本的代码逻辑后,重新编写相应的SQL。然而,人工编码的方式不仅要求开发人员熟练掌握Python和pandas库,还需要了解特定数据库的操作方式和SQL特点,这会耗费数据工程师大量的时间和精力,导致数据库存储函数的转换效率低下。
[0036] 因此,为了解决上述问题,本公开示例性实施例提供了一种数据库存储函数生成方法,首先,创建XML(Extensible Markup Language,可扩展标记语言)定义转换配置文件,然后基于配置文件,创建存储函数的主体框架代码。进而,提取出Python代码的框架层次,并对Python代码进行类型识别。将不同类型的代码转换成SQL语句,并根据框架层次将SQL语句拼合起来,生成目标存储函数。
[0037] 示例性的,图1为本公开一示例性提供的一种数据库存储函数生成方法的流程图。如图1所示,数据库存储函数生成方法可以包括以下步骤:
[0038] 步骤S101:基于XML定义转换配置文件。
[0039] 示例性的,可以基于XML定义转换配置文件,配置文件中定义了数据库类型、数据库连接信息、代码生成模式、存储函数格式、外部表格式、数据类型映射关系、变量类型预测模式、SQL结构优化模式等存储函数生成过程中所必需的相关信息,并预设置了MySQL和PostgreSQL两种主流开源数据库的配置模版,如需扩展支持其他数据库,可以按照模版按需修改相应XML配置文件。
[0040] 其中,数据库类型可以配置指定目标数据库的类型,例如MySQL(数据库管理系统)或PostgreSQL(数据库管理系统)。后续生成的存储函数SQL将根据目标数据库的语法和特性进行相应的调整和生成。
[0041] 数据库连接信息是目标数据库的连接信息,可以包括主机地址、端口号、用户名和密码等。数据库连接信息用于在生成过程中建立与数据库的连接,以便执行SQL语句和创建存储函数。通过配置文件的方式,可以通过修改连接信息,快速连接不同的数据库环境。
[0042] 存储函数格式可以包括存储函数的名称、参数、返回值和其他相关信息。通过配置存储函数格式,可以确保生成的存储函数与用户需求相匹配,并按照所定义的格式进行生成。
[0043] 外部表格式用于指定外部文件的路径、分隔符、列类型等信息。这样,在生成过程中,可以根据配置文件中定义的外部表格式,创建相应的数据库表,并使用适当的SQL语句将外部文件中的数据导入到数据库表中。
[0044] 数据类型映射关系表示Python数据类型与目标数据库数据类型之间的映射关系。通过配置文件中的数据类型映射关系,可以指定不同数据类型之间的映射规则,以便在生成过程中正确地转换数据类型。
[0045] 变量类型预测模式:在生成存储函数的过程中,可以根据变量的类型推断来生成相应的代码。配置文件中可以定义变量类型预测的模式,例如基于类型提示或基于函数调用追溯。如果选择基于类型提示,可以利用Python的类型提示来直接映射生成数据库函数的入参和返回值的数据类型。如果选择基于函数调用追溯,可以通过分析函数的调用语句来推断函数的入参和返回值的数据类型。
[0046] SQL结构优化模式可以包括是否启用查询优化器、是否进行索引优化等。可以根据需求选择适当的优化方式,以生成更高效的存储函数SQL。
[0047] 基于此,通过创建XML定义转换配置文件,我们可以灵活地配置生成数据库存储函数的过程,以适应不同的数据库和需求。
[0048] 步骤S102:创建存储函数主体框架代码。
[0049] 可以基于步骤S101创建的XML配置文件,创建存储函数主体框架代码。读取配置文件中的数据库类型、存储函数名称以及存储函数框架模版内容等属性,将用户配置的属性值从XML获得替换填充到框架模版代码的占位符中,输出存储函数的框架代码。
[0050] 具体地,先对XML配置文件进行解析,这个文件包含了所有必要的属性和参数,如数据库类型、存储函数名称以及存储函数框架模板内容等。这些属性信息在XML文件中根据不同的数据库类型和用户需求进行定义。
[0051] 然后,XML文件中的属性值,并将这些值填充到一个预先设计好的存储函数代码模板中。这个模板是一个包含有占位符的代码框架,它可以定义存储函数的基本结构,包括函数的声明、输入参数、返回类型、以及可能包含的初始逻辑框架。
[0052] 在模板中,数据库类型会影响到函数代码中用于声明变量和语句结构的语法,因为不同的数据库系统有着不同的SQL语法和特性。存储函数名称是用户定义的,用以标识函数并在数据库中调用。而框架模板内容则定义了函数的内部结构,这可能包括局部变量的声明、控制流语句(如条件判断和循环)以及占位的SQL查询或命令。
[0053] 步骤S103:判断代码类型。
[0054] 针对Python数据分析代码进行代码模式匹配,将代码行或代码块自动划分三种类型:数据加载代码、数据操作代码、以及用户自定义函数代码。
[0055] 具体地,先对代码进行语法分析,创建抽象语法树(Abstract Syntax Tree,AST),AST是编程语言语法结构的一种表示形式,它将代码分解为节点,每个节点代表代码中的一个构造,如表达式、语句或声明。这种表示形式使得编程语言的结构以及控制流更加清晰,便于后续的处理和分析。
[0056] 然后,定义三种类型代码的识别规则,识别规则可以基于关键字或正则表达式生成,表1示出了三种代码类型对应的关键字/正则表达式:
[0057] 表1三种代码类型对应的关键字/正则表达式
[0058]
[0059] 由表1可知,数据加载代码通常涉及到读取外部数据源,因此,关键字可能包括“read_csv”、“read_excel”等pandas库中用于加载数据的函数。数据操作代码则涉及到对数据集进行处理和转换,关键字可能包括“groupby”、“merge”、“join”、“sort”、“filter”等。用户自定义函数代码是指用户创建的函数,这些函数可能执行特定的数据处理任务,识别这类代码可能涉及到对“def”关键字和函数名称的匹配。
[0060] 最后,针对AST中每个节点,通过关键字/正则表达式匹配的方法,识别出节点对应的代码类型。合并代码类型相同的代码,形成一个该代码类型的代码块,输出匹配结果。
[0061] 在AST中,相连的节点若被识别为同一类型,它们就会被合并成一个代码块。这样做的目的是将逻辑上相连且功能相同的代码组合起来,以便于后续将它们转换为相应的SQL语句。合并后的代码块将作为输出的匹配结果,为下一步转换过程提供清晰的逻辑单元。
[0062] 基于此,通过识别和区分出Python数据分析脚本中不同的代码类型,不仅有助于将复杂的数据处理逻辑转换成数据库层面能够理解和执行的形式,也有利于代码的维护和后续的性能优化。
[0063] 步骤S104:判断数据加载模式。
[0064] 可以通过用户在XML配置文件中设置的属性值,确定数据加载模式是外部表还是普通表。如果设置为“foreign”,则表明数据加载模式是外部表,使用数据库的外部表机制来加载数据,执行步骤S105。如果设置为“normal”,则表明数据加载模式是普通表,转换过程可以通过创建普通表并使用SQL中的COPY语句将外部文件数据导入到数据库中,执行步骤S106。
[0065] 步骤S105:基于外部表生成数据加载SQL。
[0066] 针对数据加载代码,可以通过用户在XML配置文件中设置的属性值,确定数据加载模式是外部表还是普通表。如果设置为“foreign”,则表明数据加载模式是外部表,使用数据库的外部表机制来加载数据。
[0067] 以PostgreSQL数据库为例,该数据库支持基于csv文件创建外部表,基于外部表生成数据加载SQL具体可以包括:
[0068] 首先,需要为PostgreSQL创建一个外部表的SQL规范模板,并将其加入到XML配置文件中。模板中的未知量,比如文件路径、表名等,可以使用占位符来表示。表2示出了外部表模式SQL语句模版:
[0069] 表2外部表模式SQL语句模版
[0070]
[0071]
[0072] 如表2所示,对应右侧的外部表模式SQL语句模版,${servername}读取XML文件中的用户配置;${tablename}即为python程序中定义的DataFrame名称testdata;${columns}通过csv文件数据自动识别字段及其类型;${filepath}可以填充为csv文件路径“/usr/test.csv”;${seperator}为读取到的字段,如果在Python语句中缺省,则为“,”。
[0073] 然后,可以读取步骤S103中识别的数据加载代码,将代码中相关信息(例如DataFrame名称、csv文件路径等)替换填充到模版代码的占位符中,并读取csv文件表头获取字段名称,输出对应的SQL。
[0074] 进而,定义字段类型。在本实施例中,支持两种定义字段类型的方式:1、忽略字段的实际类型,将所述字段定义为“varchar”类型。2、通过读取样例数据来自动识别字段类型,并根据数据类型识别出数值类型、时间类型和布尔类型,在建表时对应创建为numeric、datetime和boolean类型,其余类型可以定义为varchar类型。
[0075] 对于Excel或者json等其他格式的数据文件,可以先通过第三方工具,先转换为csv格式数据文件,再做进一步处理。
[0076] 最后,生成基于外部表的数据加载SQL。
[0077] 基于此,通过定义SQL模板和字段类型可以将Python中的数据加载代码转换为SQL,从而在数据库层面实现数据的处理和分析。
[0078] 步骤S106:基于普通表生成数据加载SQL。
[0079] 针对数据加载代码,可以通过用户在XML配置文件中设置的属性值,确定数据加载模式是外部表还是普通表。如果设置为“normal”,则表明数据加载模式是普通表,转换过程可以通过创建普通表并使用SQL中的COPY语句将外部文件数据导入到数据库中。
[0080] 以PostgreSQL数据库为例,基于普通表生成数据加载SQL具体可以包括:
[0081] 首先,需要根据创建数据库普通表和使用COPY语句加载数据的SQL语句规范,创建相应的SQL模板,并将其加入到XML配置文件中。模板中的未知量,比如文件路径、表名、字段名和字段类型,使用占位符来表示。表3示出了普通表模式SQL语句模版:
[0082] 表3普通表模式SQL语句模版
[0083]
[0084]
[0085] 如表2所示,对应右侧的普通表模式SQL语句模版,${tablename}即为Python程序中定义的DataFrame名称testdata;${columns}通过csv文件数据自动识别字段及其类型;${filepath}为csv文件路径“/usr/test.csv”;${seperator}为读取到的字段分隔符“;”,如果在Python语句中缺省,则为“,”。
[0086] 然后,可以读取步骤S103中识别的数据加载代码,将代码中相关信息(例如DataFrame名称、csv文件路径等)替换填充到模版代码的占位符中,并读取csv文件表头获取字段名称,输出对应的SQL。
[0087] 进而,定义字段类型。在本实施例中,支持两种定义字段类型的方式:1、忽略字段的实际类型,将所述字段定义为“varchar”类型。2、通过读取样例数据来自动识别字段类型,并根据数据类型识别出数值类型、时间类型和布尔类型,在建表时对应创建为numeric、datetime和boolean类型,其余类型可以定义为varchar类型。
[0088] 对于Excel或者json等其他格式的数据文件,可以先通过第三方工具,先转换为csv格式数据文件,再做进一步处理。
[0089] 最后,生成基于外部表的数据加载SQL。
[0090] 基于此,通过将Python代码中的数据加载操作转换成SQL语句,可以用于在数据库中创建普通表并加载数据,从而在数据库层面实现数据的处理和分析。
[0091] 步骤S107:定义数据操作算子映射规则。
[0092] 针对数据操作代码,可以先定义数据操作算子映射规则,再根据数据操作算子映射规则,将Python编写的数据分析脚本转化为数据库存储函数。定义数据操作算子映射规则具体可以包括:
[0093] 首先,需要对Python pandas提供的数据操作算子进行归类和分析,数据操作算子的类型可以包括:数据选择与索引、数据过滤、数据排序、数据聚合、数据合并、数据转换、数据清洗、列操作或统计函数。
[0094] 然后,定义数据操作算子映射规则,针对Python pandas中支持的各种类型的算子操作,定义其在数据库SQL中的对应编码模式,作为数据操作SQL代码自动生成的基础。表4示出了部分数据操作算子映射规则:
[0095] 表4数据操作算子映射规则
[0096]
[0097] 对于定义好的数据操作算子映射规则可以存储在一个可以访问的位置,通常是XML配置文件或数据库中。这些规则可以是模板化的字符串,其中包含占位符来动态插入具体的列名、表名、条件等。
[0098] 基于此,定义数据操作算子映射规则,针对Python pandas中支持的各种类型的算子操作,定义其在数据库SQL中的对应编码模式,作为数据操作SQL代码自动生成的基础。
[0099] 步骤S108:生成数据操作SQL。
[0100] 针对数据操作代码,可以利用步骤S107制定的映射规则,生成相应的数据操作SQL。在本实施例中,支持两种数据操作SQL生成方式:1、与原Python程序一对一的生成,对于每一条Python数据操作语句的返回结果均使用一条对应的映射SQL创建表。2、生成嵌套查询语句,对于多条针对同一个dataframe进行操作的python语句,使用嵌套子查询的方式将其合并为一条SQL语句输出。使用何种数据操作SQL生成方式需要读取用户在XML配置文件中配置的。
[0101] 提取步骤S103中识别到的数据操作代码,利用上述步骤S107中定义数据操作算子映射规则,生成等效的数据操作SQL。
[0102] 基于此,根据数据操作算子映射规则,将Python编写的数据分析脚本转化为对应的数据操作SQL。
[0103] 步骤S109:基于模板生成用户自定义函数映射代码块。
[0104] 针对用户自定义函数(User Define Function,UDF)代码,可以使用plpython3u扩展插件,来生成数据库中对应的自定义函数代码。通过plpython3u扩展插件创建能够包含用户自定义函数逻辑的SQL语句模板,并且在代码生成过程中自动填充参数和返回值的数据类型。
[0105] 以PostgreSQL数据库为例,基于模板生成用户自定义函数映射代码块具体可以包括:
[0106] 首先,创建基于plpython3u的数据库函数定义语句模版,加入到XML配置文件中,部分需要在运行时载入的未知量通过占位符的方式表示。
[0107] 然后,读取在步骤S103中识别出的用户自定义函数(UDF)代码,将代码中相关信息(例如函数名称、参数名称、参数类型、返回类型、函数体等)替换填充到模版代码的占位符中。
[0108] 进而,根据用户在XML配置文件中配置的属性值,判断SQL的入参和返回值的数据类型。
[0109] 具体地,当为“type hint”时,使用Python类型提示来推断参数和返回类型。当为“autoinfer”时,通过分析UDF调用语句来追溯并推断数据类型。
[0110] 步骤S110:判断数据类型获取方式。
[0111] 针对用户自定义函数(User Define Function,UDF)代码,可以获取XML配置文件中的属性值,如果的属性值为typehint,则执行步骤S111;如果的属性值为autoinfer,则执行步骤S112。
[0112] 步骤S111:基于类型提示填充用户自定义函数的入参或返回值类型。
[0113] 针对用户自定义函数(User Define Function,UDF)代码,如果XML配置文件中的用户设定为typehint,则基于Python类型提示直接映射生成数据库函数的入参和返回值的数据类型。其中,可以预定义映射规则,制定Python数据类型与数据库数据类型之间的映射关系。进而,使用从类型提示中提取的信息来替换函数定义模板中参数和返回值的占位符,生成的函数定义将包括数据库兼容的数据类型声明。最后,根据替换后的模板生成最终的数据库函数定义代码。确保代码中的每个参数和返回值都使用了从类型提示中提取的正确的数据库数据类型。表5示出了带类型提示的用户自定义函数代码生成示例:
[0114] 表5带类型提示的用户自定义函数代码生成示例
[0115]
[0116] 基于类型提示填充用户自定义函数的入参或返回值类型的方式,要求Python代码编写者在编写代码时按照类型提示的规范制定入参和返回值类型对参数进行声明。对于已有代码,则需要在使用本方式前人工地为Python自定义函数代码添加类型提示。
[0117] 基于此,通过基于类型提示填充用户自定义函数的入参或返回值类型,可以确保字段类型在不同编程环境之间进行准确的类型转换,使得用户自定义函数能高效准确地转换为数据库存储函数。
[0118] 步骤S112:基于调用语句追溯自动推断用户自定义函数的入参或返回值类型。
[0119] 针对UDF代码,如果XML配置文件中的用户设定为autoinfer,则基于UDF调用语句追溯的方式自动推断出函数的入参和返回值的数据类型。依旧以上表5中的UDF为例,当UDF中不含有类型提示定义时,则基于函数名称自动溯源到调用该UDF的语句。当识别到该UDF的入参a和b分别对应data数据集的“a”和“b”字段(如下表6第二列所示),根据data表这两个字段数据类型自动判断出该UDF的入参数据类型(例如下表6示例中data数据集的“a”和“b”字段的数据类型均为int)。返回值类型则根据UDF中的return语句进行判断(例如下表6示例中return的变量类型为int,因此返回值类型即推断为int)。由于return语句包含未知变量类型而无法直接判断的,可以使用自底向上的方式在UDF内追溯来完成数据类型推断。表6示出了调用语句追溯自动推断用户自定义函数的生成示例:
[0120] 表6调用语句追溯自动推断用户自定义函数的生成示例
[0121]
[0122] 表6示出了调用UDF的语句转换结果,UDF本身的生成结果与上表6中第三列相同。
[0123] 基于此,在缺少显式类型提示的情况下,基于调用语句追溯自动推断用户自定义函数的入参或返回值类型,能够推断出合适的数据类型,确保字段类型在不同编程环境之间进行准确的类型转换,使得用户自定义函数能高效准确地转换为数据库存储函数。
[0124] 步骤S113:按顺序组装拼接所有SQL语句。
[0125] 将生成的数据加载、数据操作、以及用户自定义函数三类代码块根据步骤S103识别出来的抽象语法树结构组装拼接成一个完整的数据库存储函数SQL代码。
[0126] 具体地,先获取生成的代码块和步骤S103识别出来的抽象语法树结构。
[0127] 然后,根据抽象语法树结构确定各个代码块的执行顺序。其中,在确定执行顺序的过程中需要确保数据加载操作在数据操作和函数调用之前执行,还需要确保所有依赖的函数或数据结构在被引用之前已经被定义和初始化。
[0128] 进而,开始按照逻辑顺序拼接代码块。其中,可以使用适当的控制流语句(如IF条件语句、LOOP循环语句等)来组织代码块。还可以插入必要的声明语句,为变量、临时表等分配空间和数据类型。还可以在必要的位置添加错误处理和事务管理的代码。
[0129] 最后,生成完整的数据库存储函数。
[0130] 步骤S114:基于配置文件输出数据库存储函数。
[0131] 示例性的,需要根据XML配置文件中生成模式属性的配置值,如果其属性值为sqlfile,则将生成的数据库存储函数保存为本地SQL文件。如果其属性值为dbfunction,则读取用户配置的目标数据库连接信息,在目标数据库中直接执行SQL语句,创建相应的存储函数。
[0132] 具体地,针对的值为sqlfile,输出数据库存储函数可以包括:
[0133] 先创建一个包含生成的数据库存储函数SQL语句的文本文件。
[0134] 然后确定要保存SQL文件的本地路径和文件名。本地路径和文件名可以在配置文件中预先指定的,或者由程序动态生成。
[0135] 进而,将SQL代码写入到文件中,确保文件格式正确,例如字符编码,以便可以在任何SQL编辑器或数据库管理工具中打开。
[0136] 最后,保存文件后,通知用户SQL文件已成功创建,并提供文件位置信息。
[0137] 具体地,针对的值为dbfunction,输出数据库存储函数可以包括:
[0138] 先从XML配置文件中读取数据库连接信息,这可以包括数据库类型、服务器地址、端口、用户名、密码、数据库名称等。
[0139] 然后,使用这些信息建立到目标数据库的连接。在建立连接后,执行包含存储函数定义的SQL语句,以在数据库中创建该函数。
[0140] 进而,检查SQL语句执行的结果,确认是否成功创建了存储函数。
[0141] 最后,如果执行成功,向用户反馈创建成功的消息。如果执行失败,则需要捕获错误信息,并将错误详情反馈给用户,以便用户可以进行问题排查和修正。
[0142] 基于此,根据XML配置文件中的生成模式属性值,用户可以灵活地控制存储函数的生成和部署方式,从而更好地将数据库存储函数集成到他们的开发和部署流程中。
[0143] 本公开示例性实施例中提供的一个或多个技术方案,实现了Python数据分析脚本到数据库存储函数的自动化生成,大大减少了手动编写和调整的工作量。其次,通过XML配置文件和规则定义,提供了可配置性,能够适应不同数据库和用户需求。此外,采用语法分析和模式匹配技术,能够准确识别不同类型的代码块,提高了生成的准确性和可靠性。通过数据操作映射规则,将Python数据操作代码转化为对应的SQL语句,减少了手动编写SQL的复杂性和错误。最后,能够按顺序组装和拼接代码块,生成完整的数据库存储函数SQL,并根据配置选择保存为本地文件或直接执行在目标数据库中,提供了灵活的代码组装和执行方式。
[0144] 因此,本公开示例性实施例中提供的数据库存储函数生成方法能够自动化生成多种代码类型对应的数据库存储函数,从而降低数据库存储函数转换过程中的人力成本,并提高数据库存储函数的转换效率。
[0145] 基于上述实施例,本公开还提供的一种数据库存储函数生成方法,图2为本公开一示例性提供的数据库存储函数生成方法的流程原理图,如图2所示,该一种数据库存储函数生成方法可以包括如下步骤:
[0146] 步骤S210:接收待处理的原始代码,并获取原始代码对应的语法结构信息。
[0147] 实施例中,原始代码可以是分析和处理数据集的各种类型代码,包括但不限于Python、R、Java或C/C++。
[0148] 示例性的,获得原始代码对应的语法结构信息,可以包括以下步骤:
[0149] 首先,先对原始代码进行语法分析,将原始代码分解为词法单元,如标识符、运算符、常量等。这可以通过使用词法分析器或正则表达式等方法实现。
[0150] 然后,根据词法单元构建语法树,表示原始代码的语法结构。语法分析器可以根据语法规则(通常以文法形式定义)对词法单元进行解析,并生成语法树。常用的语法分析算法包括递归下降法、LR分析法等。
[0151] 最后,对语法树进行语义检查和分析,以确保代码的合法性和语义正确性。语义分析可以包括类型检查、作用域分析、语义规则验证等。
[0152] 步骤S220:获取用户预先设置的属性信息和数据库存储函数生成模板;属性信息用于定义数据库存储函数的参数属性值。
[0153] 在本实施例中,属性信息相当于上述实施例中的XML配置文件,XML配置文件可以用于定义和配置自动生成数据库存储函数的过程中所需的相关信息和参数。
[0154] 具体地,属性信息可以包括:
[0155] 数据库类型(如MySQL、PostgreSQL等)和相应的连接信息(如主机名、端口号、用户名、密码等),以便程序能够与目标数据库建立连接。
[0156] 代码生成模式:通过XML配置文件,可以指定代码生成模式,例如存储函数格式、外部表格式、数据类型映射关系、变量类型预测模式、SQL结构优化模式等。这些配置信息会影响生成的存储函数代码的结构和语法。
[0157] 数据加载方式:XML配置文件可以设置数据加载代码的属性,如数据加载类型、外部文件路径等。根据配置文件中的设定,可以选择将数据通过普通表和COPY语句载入数据库,或者采用其他方式进行数据加载。
[0158] 用户自定义函数:XML配置文件可以定义用户自定义函数的属性,如函数类型(typehint或autoinfer)、函数名称、输入参数类型、返回值类型等。这些配置信息可以在生成存储函数时,根据用户定义的自定义函数代码进行相应的处理和映射。
[0159] 通过预先设置的属性信息,可以将相关的配置信息从代码中分离出来,使得配置的修改和调整变得更加方便和灵活。同时,XML提供了一种通用的数据格式,易于解析和处理,使得程序能够根据配置文件中的信息进行相应的生成和操作。
[0160] 示例性的,通过解析用户预先设置的属性信息,可以获取属性信息和数据库存储函数生成模板。属性信息可以包含数据库类型、连接信息、代码生成模式、数据加载方式、用户自定义函数等信息。
[0161] 进而,解析XML内容,可以使用适当的XML解析库,如ElementTree或BeautifulSoup,解析XML配置文件并提取所需的属性信息。
[0162] 然后,将从XML配置文件中提取的属性信息存储在适当的数据结构中,如字典或对象,以便后续生成数据库存储函数时使用。
[0163] 最后,根据用户预先设置的属性信息,选择相应的数据库存储函数生成模板。数据库存储函数生成模板可以是用户预先设置并存储于模板库的模版,不同的数据库存储函数生成模板可以适应不同的代码生成需求和配置选项。
[0164] 步骤S230:将数据库存储函数生成模板、属性信息和原始代码输入数据库存储函数生成模块中,获得多个数据库存储函数子结果;数据库存储函数生成模块包括代码分类子模块和数据库存储函数转换子模块,代码分类子模块基于代码类型将原始代码拆分成多个代码块;数据库存储函数转换子模块基于代码类型和属性信息调整数据库存储函数生成模板,并基于调整后的数据库存储函数生成模板将各代码类型对应的代码块分别转换为对应的数据库存储函数子结果。
[0165] 实施例中,数据库存储函数生成模块可以包括代码分类子模块和数据库存储函数转换子模块。
[0166] 其中,代码分类子模块可以根据原始代码中各代码行的类型,使用代码分类子模块将原始代码拆分为多个代码块。分类时根据不同的需求和规则,如可以根据函数、类、语句块等进行代码块的划分。将原始代码分为多个部分,可以方便后续进行数据库存储函数转换。
[0167] 然后使用数据库存储函数转换子模块,基于代码类型和属性信息,调整数据库存储函数生成模板。根据代码类型和属性信息,选择适当的数据库存储函数生成模板,并对其进行必要的调整和定制化。
[0168] 最后,将调整后的数据库存储函数生成模板应用于各个代码块,将每个代码块转换为对应的数据库存储函数子结果。这个过程可以涉及到模板替换、变量映射和代码结构调整等操作,以确保生成的数据库存储函数子结果符合预期的格式和语法要求。
[0169] 步骤S240:基于语法结构信息拼合多个数据库存储函数子结果,获得目标数据库存储函数。
[0170] 实施例中,可以通过之前获取的原始代码的语法结构信息,对多个数据库存储函数子结果进行解析和分析。其中,解析过程可能涉及到语法树的遍历、节点匹配和结构分析等操作。
[0171] 然后,根据语法结构信息,通过合并不同代码块的函数调用、变量传递和语句顺序等操作,将多个数据库存储函数子结果按照正确的顺序和层次进行拼合。
[0172] 最后,可以通过代码块的连接、缩进和格式化等操作,将拼合后的数据库存储函数子结果组合成最终的目标数据库存储函数。
[0173] 基于此,根据代码类型和属性信息调整数据库存储函数生成模板,使得调整后的数据库存储函数生成模板可以适应不同的业务需求和数据库类型。使用代码分类子模块将原始代码拆分成多个代码块,并根据代码类型和属性信息进行相应的数据库存储函数转换,使得上述方法能够自动化生成多种代码类型对应的数据库存储函数,从而降低数据库存储函数转换过程中的人力成本,并提高数据库存储函数的转换效率。
[0174] 基于上述实施例,在本公开提供的又一实施例中,上述步骤S230具体可以包括:
[0175] 获取预设的代码分类规则;代码分类规则包括多个代码类型分别对应的关键参数,和/或,正则表达式;
[0176] 遍历原始代码中的代码行;
[0177] 在代码行包括关键参数,和/或,正则表达式的情况下,确定代码行对应的代码类型;
[0178] 将代码类型相同的代码行合并成代码块,获得各代码类型分别对应的代码块。
[0179] 实施例中,预设的代码分类规则可以基于关键字,和/或,正则表达式将原始代码分别分类为数据加载代码、数据操作代码、以及用户自定义函数代码三种类型。代码类型及其对应的关键字,和/或,正则表达式可以参见上文表1,以及表1对应的内容。
[0180] 对原始代码进行语法分析,创建抽象语法树(Abstract Syntax Tree,AST),AST是编程语言语法结构的一种表示形式,它将代码分解为节点,每个节点代表代码中的一个构造,如表达式、语句或声明。
[0181] 遍历AST中每个节点,通过关键字/正则表达式匹配的方法,识别出节点对应的代码类型。合并代码类型相同的代码,形成一个该代码类型的代码块,输出匹配结果。
[0182] 在AST中,相连的节点若被识别为同一类型,它们就会被合并成一个代码块。这样做的目的是将逻辑上相连且功能相同的代码组合起来,以便于后续将它们转换为相应的SQL语句。合并后的代码块将作为输出的匹配结果,为下一步转换过程提供清晰的逻辑单元。
[0183] 基于此,通过识别和区分出Python数据分析脚本中不同的代码类型,不仅有助于将复杂的数据处理逻辑转换成数据库层面能够理解和执行的形式,也有利于代码的维护和后续的性能优化。
[0184] 基于上述实施例,在本公开提供的又一实施例中,代码类型包括数据加载代码,上述方法具体可以包括:
[0185] 在代码类型为数据加载代码的情况下,基于属性信息确定数据加载模式;
[0186] 基于数据加载模式调整数据库存储函数生成模板,获得调整后的数据库存储函数生成模板;
[0187] 获取数据加载代码对应代码块中的第一标识信息,并将第一标识信息填充进调整后的数据库存储函数生成模板中,获得数据加载代码对应的数据库存储函数子结果。
[0188] 实施例中,针对数据加载代码,可以通过用户在XML配置文件中设置的属性值,确定数据加载模式是外部表还是普通表。如果设置为“foreign”,则表明数据加载模式是外部表,使用数据库的外部表机制来加载数据。如果设置为“normal”,则表明数据加载模式是普通表,转换过程可以通过创建普通表并使用SQL中的COPY语句将外部文件数据导入到数据库中。
[0189] 可以根据确定的数据加载模式,对数据库存储函数生成模板进行相应的调整。例如,如果数据加载模式是外部表,调整后的模板则需要包含外部表的定义和加载语句;如果数据加载模式是普通表,调整后的模板则需要包含表的创建和数据导入语句。
[0190] 实施例中,第一标识信息可以是代码块中的变量、文件路径或其他标识符,用于唯一标识该数据加载操作。将第一标识信息填充进调整后的数据库存储函数生成模板中的相应位置。根据模板的结构和语法,确定将第一标识信息填充的具体位置,确保生成的数据库存储函数子结果具有正确的标识信息。
[0191] 示例性的,数据加载模式是外部表的数据库存储函数生成模板请参见上文表2,数据加载模式是普通表的数据库存储函数生成模板请参见上文表3。
[0192] 基于此,根据数据加载模式调整数据库存储函数生成模板,并将数据加载代码对应代码块中的第一标识信息填充进调整后的模板中,从而获得数据加载代码对应的数据库存储函数子结果,从而根据具体的数据加载需求和配置信息,生成适用于外部表或普通表的数据库存储函数子结果。
[0193] 基于上述实施例,在本公开提供的又一实施例中,针对数据加载代码,上述方法具体可以包括:
[0194] 获取预先设置的字段类型定义规则;
[0195] 基于字段类型定义规则确定数据库存储函数中各字段分别对应的字段类型;字段类型定义规则包括将各字段的字段类型定义为第一字段类型,和/或,基于不同的字段分类分别设置对应的字段类型;
[0196] 将字段类型填充进调整后的数据库存储函数生成模板中。
[0197] 实施例中,字段类型定义规则可以包括将各字段的字段类型定义为第一字段类型,第一字段类型可以是“varchar”类型。字段类型定义规则还可以包括基于不同的字段分类分别设置对应的字段类型,如通过读取样例数据来自动识别字段类型,并根据数据类型识别出数值类型、时间类型和布尔类型,在建表时对应创建为numeric、datetime和boolean类型,其余类型可以定义为varchar类型。对于Excel或者json等其他格式的数据文件,可以先通过第三方工具,先转换为csv格式数据文件,再做进一步处理。
[0198] 实施例中,将字段类型填充进调整后的数据库存储函数生成模板中的具体步骤可以包括:
[0199] 先根据调整后的数据库存储函数生成模板的结构,确定需要填充字段类型的具体位置。这可能是模板中的变量、占位符或其他标识符。
[0200] 将确定的字段类型填充进调整后的数据库存储函数生成模板中的相应位置。确保将字段类型正确地填充到对应的字段定义的位置,以确保生成的数据库存储函数具有正确的字段类型。
[0201] 基于此,通过获取预先设置的字段类型定义规则,并根据规则确定各字段在数据库存储函数中对应的字段类型。然后,将这些字段类型填充进调整后的数据库存储函数生成模板中的相应位置,以生成符合字段类型定义规则的数据库存储函数子结果。
[0202] 基于上述实施例,在本公开提供的又一实施例中,代码类型包括数据操作代码,上述方法具体可以包括:
[0203] 在代码类型为数据操作代码的情况下,获取数据操作算子映射规则;数据操作算子映射规则包括原始代码与数据库存储函数之间的映射关系;
[0204] 基于数据操作算子映射规则和属性信息,调整数据库存储函数生成模板,获得调整后的数据库存储函数生成模板;
[0205] 获取数据操作代码对应代码块中的第二标识信息,并将第二标识信息填充进调整后的数据库存储函数生成模板中,获得数据操作代码对应的数据库存储函数子结果。
[0206] 实施例中,数据操作算子映射规则用于表示原始代码与数据库存储函数之间的映射关系,数据操作算子映射规则可以以配置文件、数据库表或其他形式存储。
[0207] 针对数据操作代码,可以先定义数据操作算子映射规则,再根据数据操作算子映射规则,将Python编写的数据分析脚本转化为数据库存储函数。定义数据操作算子映射规则具体可以包括:
[0208] 首先,需要对Python pandas提供的数据操作算子进行归类和分析,数据操作算子的类型可以包括:数据选择与索引、数据过滤、数据排序、数据聚合、数据合并、数据转换、数据清洗、列操作、统计函数
[0209] 然后,定义数据操作算子映射规则,针对Python pandas中支持的各种类型的算子操作,定义其在数据库SQL中的对应编码模式,作为数据操作SQL代码自动生成的基础。数据操作算子映射规则可以参见上文表4。
[0210] 可以根据属性信息,对数据库存储函数生成模板进行相应的调整,以生成适合的数据库存储函数。
[0211] 还可以从数据操作代码对应的代码块中提取第二标识信息。第二标识信息可以是代码块中的变量、表名、条件语句或其他标识符,用于唯一标识该数据操作。
[0212] 将第二标识信息填充进调整后的数据库存储函数生成模板中的相应位置。根据模板的结构和语法,确定将第二标识信息填充的具体位置,确保生成的数据库存储函数子结果具有正确的标识信息。
[0213] 基于此,基于数据操作算子映射规则和属性信息,调整数据库存储函数生成模板,并将数据操作代码对应代码块中的第二标识信息填充进调整后的模板中,从而获得数据操作代码对应的数据库存储函数子结果。从而根据具体的数据操作需求和映射规则,生成适用于数据库的存储函数子结果。
[0214] 基于上述实施例,在本公开提供的又一实施例中,针对数据操作代码,上述方法具体可以包括:
[0215] 获取属性信息中的数据库存储函数生成模式;数据库存储函数生成模式包括单条语句生成模式或嵌套查询语句生成模式;
[0216] 基于数据库存储函数生成模式和调整后的数据库存储函数生成模板,获得数据操作代码对应的数据库存储函数子结果。
[0217] 实施例中,获取包含属性信息的XML配置文件或数据库表。属性信息中包括有关数据库存储函数生成模式的设置。根据配置文件或数据库表的存储形式,解析属性信息。解析后,获得数据库存储函数生成模式的属性值,数据库存储函数生成模式包括单条语句生成模式或嵌套查询语句生成模式。单条语句生成模式表示每条数据操作代码对应一条独立的生成的数据库存储函数语句,而嵌套查询语句生成模式表示多条数据操作代码针对同一数据源的操作会被合并为一条嵌套查询语句。
[0218] 示例性的,可以根据用户配置文件中的设置,确定使用单条语句生成模式还是嵌套查询语句生成模式。然后,根据所选的生成模式调整数据库存储函数生成模板,并根据模板和具体属性信息,生成数据操作代码对应的数据库存储函数子结果,从而根据不同的需求生成适用于数据库的存储函数子结果。
[0219] 基于上述实施例,在本公开提供的又一实施例中,代码类型包括用户自定义函数代码,上述方法具体可以包括:
[0220] 在代码类型为用户自定义函数代码的情况下,获取用户自定义函数代码对应代码块中的第三标识信息;
[0221] 将第三标识信息填充进数据库存储函数生成模板中,获得调整后的数据库存储函数生成模板;
[0222] 基于属性信息确定用户自定义函数代码中各字段分别对应的字段类型;
[0223] 基于字段类型和调整后的数据库存储函数生成模板,获得用户自定义函数代码对应的数据库存储函数子结果。
[0224] 实施例中,第三标识信息可以包括函数名称、参数名称、参数类型、返回类型、函数体等信息,数据库存储函数生成模板可以通过plpython3u创建。
[0225] 具体地,先创建基于plpython3u的数据库函数定义语句模版,加入到XML配置文件中,部分需要在运行时载入的未知量通过占位符的方式表示。
[0226] 然后,获取用户自定义函数代码,将代码中第三标识信息替换填充到模版代码的占位符中。
[0227] 进而,根据用户在XML配置文件中配置的属性值,判断SQL的入参和返回值的数据类型。
[0228] 具体地,当为“type hint”时,使用Python类型提示来推断参数和返回类型。当为“autoinfer”时,通过分析UDF调用语句来追溯并推断数据类型。
[0229] 如果XML配置文件中的用户设定为typehint,则基于Python类型提示直接映射生成数据库函数的入参和返回值的数据类型。其中,可以预定义映射规则,制定Python数据类型与数据库数据类型之间的映射关系。进而,使用从类型提示中提取的信息来替换函数定义模板中参数和返回值的占位符,生成的函数定义将包括数据库兼容的数据类型声明。最后,根据替换后的模板生成最终的数据库函数定义代码。确保代码中的每个参数和返回值都使用了从类型提示中提取的正确的数据库数据类型。带类型提示的用户自定义函数代码生成示例请参见上文表5。
[0230] 如果XML配置文件中的用户设定为autoinfer,则基于UDF调用语句追溯的方式自动推断出函数的入参和返回值的数据类型。依旧以上表5中的UDF为例,当UDF中不含有类型提示定义时,则基于函数名称自动溯源到调用该UDF的语句。调用语句追溯自动推断用户自定义函数请参见上文表6。
[0231] 基于此,通过基于不同方式定义用户自定义函数代码的入参或返回值类型,可以确保字段类型在不同编程环境之间进行准确的类型转换,使得用户自定义函数能高效准确地转换为数据库存储函数。
[0232] 本公开示例性实施例中提供的一个或多个技术方案,实现了Python数据分析脚本到数据库存储函数的自动化生成,大大减少了手动编写和调整的工作量。其次,通过XML配置文件和规则定义,提供了可配置性,能够适应不同数据库和用户需求。此外,采用语法分析和模式匹配技术,能够准确识别不同类型的代码块,提高了生成的准确性和可靠性。通过数据操作映射规则,将Python数据操作代码转化为对应的SQL语句,减少了手动编写SQL的复杂性和错误。最后,能够按顺序组装和拼接代码块,生成完整的数据库存储函数SQL,并根据配置选择保存为本地文件或直接执行在目标数据库中,提供了灵活的代码组装和执行方式。
[0233] 因此,本公开示例性实施例中提供的数据库存储函数生成方法能够自动化生成多种代码类型对应的数据库存储函数,从而降低数据库存储函数转换过程中的人力成本,并提高数据库存储函数的转换效率。
[0234] 上述主要对本公开示例性实施例提供的方案进行了介绍。可以理解的是,为了实现上述功能,电子设备包含了执行各个功能相应的硬件结构和/或软件模块。本领域技术人员应该很容易意识到,结合本文中所公开的实施例描述的各示例的单元及算法步骤,本公开能够以硬件或硬件和计算机软件的结合形式来实现。某个功能究竟以硬件还是计算机软件驱动硬件的方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本公开的范围。
[0235] 本公开示例性实施例可以根据上述方法示例对电子设备进行功能单元的划分,例如,可以对应各个功能划分各个功能模块,也可以将两个或两个以上的功能集成在一个处理模块中。上述集成的模块既可以采用硬件的形式实现,也可以采用软件功能模块的形式实现。需要说明的是,本公开示例性实施例中对模块的划分是示意性的,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式。
[0236] 在采用对应各个功能划分各个功能模块的情况下,本公开示例性实施例提供一种数据库存储函数生成装置,该数据库存储函数生成装置可以为服务器或应用于服务器的芯片。图3为本公开一示例性提供的数据库存储函数生成装置的功能模块示意性框图。如图3所示,该数据库存储函数生成装置300包括:
[0237] 数据获取模块310,用于接收待处理的原始代码,并获取所述原始代码对应的语法结构信息;
[0238] 数据处理模块320,用于获取用户预先设置的属性信息和数据库存储函数生成模板;所述属性信息用于定义数据库存储函数的参数属性值;
[0239] 所述数据处理模块320,还用于将所述数据库存储函数生成模板、所述属性信息和所述原始代码输入数据库存储函数生成模块中,获得多个数据库存储函数子结果;所述数据库存储函数生成模块包括代码分类子模块和数据库存储函数转换子模块,所述代码分类子模块基于代码类型将所述原始代码拆分成多个代码块;所述数据库存储函数转换子模块基于所述代码类型和所述属性信息调整所述数据库存储函数生成模板,并基于调整后的数据库存储函数生成模板将各代码类型对应的代码块分别转换为对应的数据库存储函数子结果;
[0240] 所述数据处理模块320,还用于基于所述语法结构信息拼合所述多个数据库存储函数子结果,获得目标数据库存储函数。
[0241] 在本公开提供的又一实施例中,所述数据处理模块320,还用于获取预设的代码分类规则;所述代码分类规则包括多个代码类型分别对应的关键参数,和/或,正则表达式;遍历所述原始代码中的代码行;在代码行包括所述关键参数,和/或,所述正则表达式的情况下,确定所述代码行对应的代码类型;将代码类型相同的代码行合并成代码块,获得各代码类型分别对应的代码块。
[0242] 在本公开提供的又一实施例中,所述代码类型包括数据加载代码,所述数据处理模块320,还用于在所述代码类型为数据加载代码的情况下,基于所述属性信息确定数据加载模式;基于所述数据加载模式调整所述数据库存储函数生成模板,获得调整后的数据库存储函数生成模板;获取所述数据加载代码对应代码块中的第一标识信息,并将所述第一标识信息填充进调整后的数据库存储函数生成模板中,获得所述数据加载代码对应的数据库存储函数子结果。
[0243] 在本公开提供的又一实施例中,所述数据处理模块320,还用于获取预先设置的字段类型定义规则;基于所述字段类型定义规则确定数据库存储函数中各字段分别对应的字段类型;所述字段类型定义规则包括将各字段的字段类型定义为第一字段类型,和/或,基于不同的字段分类分别设置对应的字段类型;将所述字段类型填充进调整后的数据库存储函数生成模板中。
[0244] 在本公开提供的又一实施例中,所述代码类型包括数据操作代码,所述数据处理模块320,还用于在所述代码类型为数据操作代码的情况下,获取数据操作算子映射规则;所述数据操作算子映射规则包括所述原始代码与所述数据库存储函数之间的映射关系;基于所述数据操作算子映射规则和所述属性信息,调整所述数据库存储函数生成模板,获得调整后的数据库存储函数生成模板;获取所述数据操作代码对应代码块中的第二标识信息,并将所述第二标识信息填充进调整后的数据库存储函数生成模板中,获得所述数据操作代码对应的数据库存储函数子结果。
[0245] 在本公开提供的又一实施例中,所述数据处理模块320,还用于获取所述属性信息中的数据库存储函数生成模式;所述数据库存储函数生成模式包括单条语句生成模式或嵌套查询语句生成模式;基于所述数据库存储函数生成模式和调整后的数据库存储函数生成模板,获得所述数据操作代码对应的数据库存储函数子结果。
[0246] 在本公开提供的又一实施例中,所述代码类型包括用户自定义函数代码,所述数据处理模块320,还用于在所述代码类型为用户自定义函数代码的情况下,获取所述用户自定义函数代码对应代码块中的第三标识信息;将所述第三标识信息填充进所述数据库存储函数生成模板中,获得调整后的数据库存储函数生成模板;基于所述属性信息确定所述用户自定义函数代码中各字段分别对应的字段类型;基于所述字段类型和调整后的数据库存储函数生成模板,获得所述用户自定义函数代码对应的数据库存储函数子结果。
[0247] 图4为本公开一示例性提供的芯片的示意性框图。如图4所示,该芯片400包括一个或两个以上(包括两个)处理器401和通信接口402。通信接口402可以支持服务器执行上述方法中的数据收发步骤,处理器401可以支持服务器执行上述方法中的数据处理步骤。
[0248] 可选的,如图4所示,该芯片400还包括存储器403,存储器403可以包括只读存储器和随机存取存储器,并向处理器提供操作指令和数据。存储器的一部分还可以包括非易失性随机存取存储器(non‑volatile random access memory,NVRAM)。
[0249] 在一些实施方式中,如图4所示,处理器401通过调用存储器存储的操作指令(该操作指令可存储在操作系统中),执行相应的操作。处理器401控制终端设备中任一个的处理操作,处理器还可以称为中央处理单元(centralprocessing unit,CPU)。存储器403可以包括只读存储器和随机存取存储器,并向处理器提供指令和数据。存储器403的一部分还可以包括NVRAM。例如应用中存储器、通信接口以及存储器通过总线系统耦合在一起,其中总线系统除包括数据总线之外,还可以包括电源总线、控制总线和状态信号总线等。但是为了清楚说明起见,在图4中将各种总线都标为总线系统404。
[0250] 上述本公开实施例揭示的方法可以应用于处理器中,或者由处理器实现。处理器可能是一种集成电路芯片,具有信号的处理能力。在实现过程中,上述方法的各步骤可以通过处理器中的硬件的集成逻辑电路或者软件形式的指令完成。上述的处理器可以是通用处理器、数字信号处理器(digital signal processing,DSP)、ASIC、现成可编程门阵列(field‑programmable gate array,FPGA)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件。可以实现或者执行本公开实施例中的公开的各方法、步骤及逻辑框图。通用处理器可以是微处理器或者该处理器也可以是任何常规的处理器等。结合本公开实施例所公开的方法的步骤可以直接体现为硬件译码处理器执行完成,或者用译码处理器中的硬件及软件模块组合执行完成。软件模块可以位于随机存储器,闪存、只读存储器,可编程只读存储器或者电可擦写可编程存储器、寄存器等本领域成熟的存储介质中。该存储介质位于存储器,处理器读取存储器中的信息,结合其硬件完成上述方法的步骤。
[0251] 本公开示例性实施例还提供一种电子设备,包括:至少一个处理器;以及与至少一个处理器通信连接的存储器。所述存储器存储有能够被所述至少一个处理器执行的计算机程序,所述计算机程序在被所述至少一个处理器执行时用于使所述电子设备执行根据本公开实施例的方法。
[0252] 本公开示例性实施例还提供一种存储有计算机程序的非瞬时计算机可读存储介质,其中,所述计算机程序在被计算机的处理器执行时用于使所述计算机执行根据本公开实施例的方法。
[0253] 本公开示例性实施例还提供一种计算机程序产品,包括计算机程序,其中,所述计算机程序在被计算机的处理器执行时用于使所述计算机执行根据本公开实施例的方法。
[0254] 图5为本公开一示例性提供的电子设备的结构框图,现将描述可以作为本公开的服务器或客户端的电子设备500的结构框图,其是可以应用于本公开的各方面的硬件设备的示例。电子设备旨在表示各种形式的数字电子的计算机设备,诸如,膝上型计算机、台式计算机、工作台、个人数字助理、服务器、刀片式服务器、大型计算机、和其它适合的计算机。电子设备还可以表示各种形式的移动装置,诸如,个人数字处理、蜂窝电话、智能电话、可穿戴设备和其它类似的计算装置。本文所示的部件、它们的连接和关系、以及它们的功能仅仅作为示例,并且不意在限制本文中描述的和/或者要求的本公开的实现。
[0255] 如图5所示,电子设备500包括计算单元501,其可以根据存储在只读存储器(ROM)502中的计算机程序或者从存储单元508加载到随机访问存储器(RAM)503中的计算机程序,来执行各种适当的动作和处理。在RAM 503中,还可存储电子设备500操作所需的各种程序和数据。计算单元501、ROM 502以及RAM 503通过总线504彼此相连。输入/输出(I/O)接口
505也连接至总线504。
[0256] 电子设备500中的多个部件连接至I/O接口505,包括:输入单元506、输出单元507、存储单元508以及通信单元509。输入单元506可以是能向电子设备500输入信息的任何类型的设备,输入单元506可以接收输入的数字或字符信息,以及产生与电子设备的用户设置和/或功能控制有关的键信号输入。输出单元507可以是能呈现信息的任何类型的设备,并且可以包括但不限于显示器、扬声器、视频/音频输出终端、振动器和/或打印机。存储单元508可以包括但不限于磁盘、光盘。通信单元509允许电子设备500通过诸如因特网的计算机网络和/或各种电信网络与其他设备交换信息/数据,并且可以包括但不限于调制解调器、网卡、红外通信设备、无线通信收发机和/或芯片组,例如蓝牙TM设备、WiFi设备、WiMax设备、蜂窝通信设备和/或类似物。
[0257] 计算单元501可以是各种具有处理和计算能力的通用和/或专用处理组件。计算单元501的一些示例包括但不限于中央处理单元(CPU)、图形处理单元(GPU)、各种专用的人工智能(AI)计算芯片、各种运行机器学习模型算法的计算单元、数字信号处理器(DSP)、以及任何适当的处理器、控制器、微控制器等。计算单元501执行上文所描述的各个方法和处理。上文所描述的各个方法均可被实现为计算机软件程序,其被有形地包含于机器可读介质,例如存储单元508。在一些实施例中,计算机程序的部分或者全部可以经由ROM 502和/或通信单元509而被载入和/或安装到电子设备500上。
[0258] 用于实施本公开的方法的程序代码可以采用一个或多个编程语言的任何组合来编写。这些程序代码可以提供给通用计算机、专用计算机或其他可编程数据处理装置的处理器或控制器,使得程序代码当由处理器或控制器执行时使流程图和/或框图中所规定的功能/操作被实施。程序代码可以完全在机器上执行、部分地在机器上执行,作为独立软件包部分地在机器上执行且部分地在远程机器上执行或完全在远程机器或服务器上执行。
[0259] 在本公开的上下文中,机器可读介质可以是有形的介质,其可以包含或存储以供指令执行系统、装置或设备使用或与指令执行系统、装置或设备结合地使用的程序。机器可读介质可以是机器可读信号介质或机器可读储存介质。机器可读介质可以包括但不限于电子的、磁性的、光学的、电磁的、红外的、或半导体系统、装置或设备,或者上述内容的任何合适组合。机器可读存储介质的更具体示例会包括基于一个或多个线的电气连接、便携式计算机盘、硬盘、随机存取存储器(RAM)、只读存储器(ROM)、可擦除可编程只读存储器(EPROM或快闪存储器)、光纤、便捷式紧凑盘只读存储器(CD‑ROM)、光学储存设备、磁储存设备、或上述内容的任何合适组合。
[0260] 如本公开使用的,术语“机器可读介质”和“计算机可读介质”指的是用于将机器指令和/或数据提供给可编程处理器的任何计算机程序产品、设备、和/或装置(例如,磁盘、光盘、存储器、可编程逻辑装置(PLD)),包括,接收作为机器可读信号的机器指令的机器可读介质。术语“机器可读信号”指的是用于将机器指令和/或数据提供给可编程处理器的任何信号。
[0261] 为了提供与用户的交互,可以在计算机上实施此处描述的系统和技术,该计算机具有:用于向用户显示信息的显示装置(例如,CRT(阴极射线管)或者LCD(液晶显示器)监视器);以及键盘和指向装置(例如,鼠标或者轨迹球),用户可以通过该键盘和该指向装置来将输入提供给计算机。其它种类的装置还可以用于提供与用户的交互;例如,提供给用户的反馈可以是任何形式的传感反馈(例如,视觉反馈、听觉反馈、或者触觉反馈);并且可以用任何形式(包括声输入、语音输入或者、触觉输入)来接收来自用户的输入。
[0262] 可以将此处描述的系统和技术实施在包括后台部件的计算系统(例如,作为数据服务器)、或者包括中间件部件的计算系统(例如,应用服务器)、或者包括前端部件的计算系统(例如,具有图形用户界面或者网络浏览器的用户计算机,用户可以通过该图形用户界面或者该网络浏览器来与此处描述的系统和技术的实施方式交互)、或者包括这种后台部件、中间件部件、或者前端部件的任何组合的计算系统中。可以通过任何形式或者介质的数字数据通信(例如,通信网络)来将系统的部件相互连接。通信网络的示例包括:局域网(LAN)、广域网(WAN)和互联网。
[0263] 计算机系统可以包括客户端和服务器。客户端和服务器一般远离彼此并且通常通过通信网络进行交互。通过在相应的计算机上运行并且彼此具有客户端‑服务器关系的计算机程序来产生客户端和服务器的关系。
[0264] 在上述实施例中,可以全部或部分地通过软件、硬件、固件或者其任意组合来实现。当使用软件实现时,可以全部或部分地以计算机程序产品的形式实现。所述计算机程序产品包括一个或多个计算机程序或指令。在计算机上加载和执行所述计算机程序或指令时,全部或部分地执行本公开实施例所述的流程或功能。所述计算机可以是通用计算机、专用计算机、计算机网络、终端、用户设备或者其它可编程装置。所述计算机程序或指令可以存储在计算机可读存储介质中,或者从一个计算机可读存储介质向另一个计算机可读存储介质传输,例如,所述计算机程序或指令可以从一个网站站点、计算机、服务器或数据中心通过有线或无线方式向另一个网站站点、计算机、服务器或数据中心进行传输。所述计算机可读存储介质可以是计算机能够存取的任何可用介质或者是集成一个或多个可用介质的服务器、数据中心等数据存储设备。所述可用介质可以是磁性介质,例如,软盘、硬盘、磁带;也可以是光介质,例如,数字视频光盘(Digital video disc,DVD);还可以是半导体介质,例如,固态硬盘(solid state drive,SSD)。
[0265] 尽管结合具体特征及其实施例对本公开进行了描述,显而易见的,在不脱离本公开的精神和范围的情况下,可对其进行各种修改和组合。相应地,本说明书和附图仅仅是所附权利要求所界定的本公开的示例性说明,且视为已覆盖本公开范围内的任意和所有修改、变化、组合或等同物。显然,本领域的技术人员可以对本公开进行各种改动和变型而不脱离本公开的精神和范围。这样,倘若本公开的这些修改和变型属于本公开权利要求及其等同技术的范围之内,则本公开也意图包括这些改动和变型在内。