一种自动生成从关系型数据库向MongoDB数据库数据迁移的代码的方法

文档序号:10725115阅读:221来源:国知局
一种自动生成从关系型数据库向MongoDB数据库数据迁移的代码的方法【专利摘要】本发明公开了一种自动生成从关系型数据库向MongoDB数据库数据迁移的代码的方法,它包括以下步骤:步骤一、从配置文件中读取运行参数,并从关系型数据库中读取元数据;步骤二、根据元数据生成模型;步骤三、根据需求定制模型;步骤四、根据模型和模板生成代码。本发明的目的是辅助程序员进行从关系型数据库向MongoDB数据库迁移,主要是数据上的迁移。相比于自写脚本,本发明更具有一般性,相比于提取转化转载(ETL)工具,本发明在数据迁移之外也有部分代码迁移的辅助。【专利说明】一种自动生成从关系型数据库向MongoDB数据库数据迁移的代码的方法
技术领域
[0001]本发明涉及一种自动生成从关系型数据库向MongoDB数据库数据迀移的代码的方法,属于数据库迀移及软件辅助开发等领域。【
背景技术
】[0002]根据EMC公司的一份报告称,世界上的数据总量正以每年40%的速度增长,到2020年,将会达到44ZB。在这样的背景下,大数据吸引了越来越多的关注。大数据指一种规模大到在获取、存储、管理、分析方面大大超出了传统数据库软件工具能力范围的数据集合。[0003]关系型数据库是建立在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据。尽管传统的关系型数据库经过多年的发展成熟稳定,但面对新兴的大数据时,它的优点,比如事务一致性和强大的sql查询能力,难以体现。而关系型数据库的不足,可扩展性和可用性低、高并发读写的性能低却被放大。[0004]为了解决关系型数据库遇到的瓶颈,人们开始研究大数据背景下的新型数据库技术,NoSQL就是其中的一种。NoSQL存储结构简单,在相比传统型数据库在大数据海量存储时有着性能上的优势。而文档型数据库MongoDB就是NoSQL中的佼佼者。具有高性能、易部署、易使用,存储数据非常方便的特点。【
发明内容】[0005]在不少情况下,应用可以通过向NoSQL数据库的迀移提高效率。[0006]本发明的目的是辅助程序员进行从关系型数据库向MongoDB数据库迀移,主要是数据上的迀移。相比于自写脚本,本发明更具有一般性,相比于提取转化转载(ETL)工具,本发明在数据迀移之外也有部分代码迀移的辅助。[0007]本发明的技术方案为:一种自动生成从关系型数据库向MongoDB数据库数据迀移的代码的方法,生成的代码包含以下步骤:[0008]I)从配置文件中读取运行参数,并从关系型数据库中读取元数据;[0009]2)根据元数据生成模型;[0010]3)根据需求定制模型;[0011]4)根据模型和模板生成代码。[0012]步骤I的具体步骤包括:[0013]1.1)从配置文件中读取参数,配置文件由用户定义,需要定义的内容包括:生成代码、关系型数据库和MongoDB的相关参数;[0014]1.2)从关系型数据库中读取所有表(table)的表名,根据表名读取每张表的元数据。读入的元数据包括表的索引(index)信息、表的外键(foreignkey)信息以及表中每一列(column)的列名。根据列名读取列的元数据,包含列名,列的类型,小数点精度。[0015]步骤2的具体步骤包括:[0016]2.1)根据元数据生成模型,模型由上一步所获取的元数据生成,模型的类型为表(list)ο[0017]2.2)对Table类中的表名命名转换,遍历每张表(table)中的列,对Column类中的列名命名转换进行获得在代码中使用的表名和列名,命名转换的方法如下:将原名转换为小写,将首字母大写,将下划线去掉,并将下划线后第一个字母大写;[00?8]2.3)遍历每张表(table)中的列,对CoIumn类中的数据类型进行变换,变换方法如下:如果类型为TINYINT、SMALLINT时使用类型short;如果类型为INTEGER时使用类型int;如果类型为BIGINT时使用类型BigInteger;如果类型为REAL、FL0AT时使用类型float;如果类型为DOUBLE时使用类型double;如果类型为DE(HMAL、NUMERIC时,若小数点精度为O,使用类型BigInteger,否则使用类型BigDecimal;如果类型为BIT、B00LEAN时使用类型boolean;如果类型为CHAR、VARCHAR、L0NGVARCHAR时使用类型String;如果类型为BINARY、VARBINARY、LONGVARBINARY时使用类型byte[];如果类型为DATE时使用类型Date;如果类型为TIME时使用类型Time;如果类型为TIMESTAMP时使用类型Timestamp;否则使用类型Object0[0019]步骤3的具体步骤包括:[0020]3.1)确认表名是否需要另外起名,如果需要,指出并修改表名,表名不能重复;[0021]3.2)确认处理连接表的方式为内嵌还是引用,默认方式为引用,如果采用内嵌的方式处理连接表,只嵌套一层;[0022]3.3)确认是否有额外的表需要连接。默认需要连接的表是有外键关系的表。如果需要,指出连接表和被连接表的表名和列名;[0023]3.4)确认每张表的列名是否需要另外起名,如果需要,指出表名和列名,并修改列名,列名不能重复;[0024]3.5)确认每张表是否有需要额外生成的方法。默认为每个单字段(列)正序生成一个方法。如果需要,指出方法名,方法名不能重复,哪些字段名,排序方式。如果需要更复杂的方法,给出实现方式。[0025]步骤4的具体步骤包括:[0026]4.1)根据模型和模板生成代码,首先是配置文件的生成,包括工程的配置文件、存放MongoDB配置的文件;[0027]4.2)遍历模型中的每张表(table),生成表对应的实体(entity)以及获取数据方法的库(Repository);[0028]4.3)生成运行文件:遍历模型中的每张表(table),生成插入表的代码,生成插入索引的代码,生成插入表中引用的代码。[0029]本发明具有如下有益效果:[0030]I)方便:能自动生成供迀移使用、一定程度上可定制的代码,减轻人工操作。生成了表对应的实体以及方法库,方便后续代码迀移;[0031]2)MongoDB特化:相比于通用ETL工具,本方法提供了对一些额外特征的支持,例如MongoDB可采用的引用方式连接表,如此更好地支持了向MongoDB的迀移。【附图说明】[0032]图1为步骤2.3中所示数据类型进行变换过程的流程图。[0033]图2为本发明实施的主要流程图。【具体实施方式】[0034]以下结合具体实施例对本发明作进一步说明。但是本发明不限于以下实施方式。本实例生成了基于SpringData框架的一个maven工程。图2为本发明实施的主要流程图。[0035]首先根据配置文件连接关系型数据库,连接的驱动视数据库类型而定。如果是Oracle数据库则使用ojdbc,如果是MySql数据库则使用mysql-connector-java,等等。然后从关系型数据库中读取所有表(table)的表名。如图2中读取元数据202所示,根据表名读取每张表的元数据,包括表的索引信息、表的外键信息以及表中每一列的列名。根据列名读取列的元数据。读取的方法使用驱动所带的jdbc方法。[0036]接着根据元数据生成模型,模型为元素类型为Table类的表(list)。如图2中对表名进行转换204所示,对Table类中的表名命名转换,遍历每张表(table)中的列,对Column类中的列名命名转换进行获得在代码中使用的表名和列名。转换后的名字用于Java代码中使用。需要转换的原因是由于不同持久化框架中对命名的要求不同,需要使用一套转换后的名字来适应更多种的框架。在本实例中生成基于SpringData框架的代码,在SpringData中下划线具有特殊的含义,所以列名中含有下划线时,再采用find+列名作为方法名时会扭曲原意。如图2中对列的数据类型进行转换205所示,遍历每张表中的列,对Column类中的数据类型进行变换。进行数据类型转换的原因是sql与java中的数据类型不尽相同。[0037]图1为步骤2.3中所示数据类型进行变换过程的流程图。[0038]如图2中确认处理连接表的方式207所示,确认处理连接表的方式为内嵌还是引用,本实例为引用。由于NoSql数据库普遍不支持连接操作,在原关系型数据库使用连接的地方迀移到NoSql数据库时需要手动将表连接起来。MongoDB推荐采用内嵌或是引用的方式连接,具体采用哪种方式视情况而定。内嵌相比引用有着更好的查询速度,然而有硬盘额外的开销,并且存在多副本的问题。引用比内嵌拥有更高的灵活性,然而会使查询的效率降低。[0039]根据模型和模板生成代码,模板为预定义的关键字空缺的代码片段,根据需求不同预定义不同的模板,生成过程为先根据需求选择模板;根据模型补全模板;将补全后的模板组合生成代码。本实例中采用使用引用方式处理连接表、并且使用SpringData框架的模板。组合模型和模板使用工具freemarker,freemarker是一种基于模板和要改变的数据来生成输出文本的通用工具。[0040]生成后的代码包括三部分,一是配置文件,包括maven工程的配置文件pom.xml、存放MongoDB配置的文件MongoConfig.java。二是数据的实体包以及与SpringData相关的Repository包。三是运行文件Main,java。[0041]运行Main,java,将数据由关系型数据库迀移到MongoDB数据库。数据的实体包以及Repository包可用于代码迀移。[0042]以上的实施例仅为说明本发明的技术思想,不能以此限定本发明的保护范围,凡是按照本发明提出的技术思想,在技术方案基础上所做的任何改动,均落入本发明保护范围之内。本发明未涉及的技术均可通过现有的技术加以实现。【主权项】1.一种自动生成从关系型数据库向MongoDB数据库数据迀移的代码的方法,其特征在于,包括以下步骤:步骤一、从配置文件中读取运行参数,并从关系型数据库中读取元数据;步骤二、根据元数据生成模型;步骤三、根据需求定制模型;步骤四、根据模型和模板生成代码。2.根据权利要求1所述的自动生成从关系型数据库向MongoDB数据库数据迀移的代码的方法,其特征在于,步骤二中根据元数据生成模型的具体步骤包括:步骤2.1根据元数据生成模型,模型由上一步所获取的元数据生成,模型的类型为表(list);步骤2.2对Table类中的表名命名转换,遍历每张表(table)中的列,对Column类中的列名命名转换进行获得在代码中使用的表名和列名,命名转换的方法如下:将原名转换为小写,将首字母大写,将下划线去掉,并将下划线后第一个字母大写;步骤2.3遍历每张表(table)中的列,对Column类中的数据类型进行变换,变换方法如下:如果类型为TINYINT、SMALLINT时使用类型short;如果类型为INTEGER时使用类型int;如果类型为BIGINT时使用类型BigInteger;如果类型为REAL、FLOAT时使用类型float;如果类型为DOUBLE时使用类型double;如果类型为DE(HMAL、NUMERIC时,若小数点精度为O,使用类型BigInteger,否则使用类型BigDecimal;如果类型为BIT、B00LEAN时使用类型boolean;如果类型为CHAR、VARCHAR、LONGVARCHAR时使用类型String;如果类型为BINARY、VARBINARY、LONGVARBINARY时使用类型byte[];如果类型为DATE时使用类型Date;如果类型为TIME时使用类型Time;如果类型为TIMESTAMP时使用类型Timestamp;否则使用类型Object03.根据权利要求1所述的自动生成从关系型数据库向MongoDB数据库数据迀移的代码的方法,其特征在于,步骤三中根据需求定制模型的具体步骤包括:步骤3.1确认表名是否需要另外起名,如果需要,指出并修改表名,表名不能重复;步骤3.2确认处理连接表的方式为内嵌还是引用,默认方式为引用,如果采用内嵌的方式处理连接表,只嵌套一层;步骤3.3确认是否有额外的表需要连接,默认需要连接的表是有外键关系的表;如果需要,指出连接表和被连接表的表名和列名;步骤3.4确认每张表的列名是否需要另外起名,如果需要,指出表名和列名,并修改列名,列名不能重复;步骤3.5确认每张表是否有需要额外生成的方法,默认为每个单字段(列)正序生成一个方法;如果需要,指出方法名,方法名不能重复,哪些字段名,排序方式;如果需要更复杂的方法,给出实现方式。4.根据权利要求1所述的自动生成从关系型数据库向MongoDB数据库数据迀移的代码的方法,其特征在于,步骤四中根据模型和模板生成代码的具体步骤包括:步骤4.1根据模型和模板生成代码,首先是配置文件的生成,包括工程的配置文件、存放MongoDB配置的文件;步骤4.2遍历模型中的每张表(table),生成表对应的实体(entity)以及获取数据方法的库(Repository);步骤4.3生成运行文件:遍历模型中的每张表(table),生成插入表的代码,生成插入索引的代码,生成插入表中引用的代码。5.根据权利要求4所述的自动生成从关系型数据库向MongoDB数据库数据迀移的代码的方法,其特征在于,步骤四中所述模板为预定义的关键字空缺的代码片段。【文档编号】G06F17/30GK106095991SQ201610454184【公开日】2016年11月9日【申请日】2016年6月21日【发明人】曹陈宸,马晓星,曹春【申请人】南京大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1