我是数据迁移领域的新手,并研究如何使用OurApp 1.0将客户数据迁移到具有与OurApp 2.0兼容的架构的新数据库。我见过不止一些人推荐Liquibase用于数据库更改管理和数据库重构任务,这对我的新手来说听起来可能接近我们需要的东西。
然而,在阅读www.liquibase.org上的资料后,我感觉Liquibase更多的是保持模式最新,而不是转换大量现有数据,以便它可以保留在新架构。
假设我想将名为name的Employee表中的列拆分为firstname和lastname列。 Liquibase可以通过删除name列并添加firstname和lastname列来更改表。但是,我觉得Liquibase并不是真正为我构建的插入转换代码,它将数据库中现有记录的名称字段解析为firstname和lastname,并将它们存储在各自的列中。
例如,假设我的表看起来像这样
id | name | position
*********************************
12 Horace Slughorn Professor
13 Albus Dumbledore Headmaster
运行Liquibase之后,name列将被firstname和lastname列替换,因此我的数据库架构是正确的。但我猜Liquibase不是一个框架,它允许我插入一些代码,将“Horace Slughorn”解析为“Horace”和“Slughorn”,并将这些值存储在该记录的firstname和lastname列中。
id | firstname | lastname | position
*****************************************
12 Horace Slughorn Professor
13 Albus Dumbledore Headmaster
因此,Liquibase使您的架构保持最新,但不是为了帮助您转换现有数据以使其与新架构匹配。是对的吗?
答案 0 :(得分:5)
Liquibase的目标是允许您将数据库从一个版本移动到新版本。它有许多内置的数据库“重构”,但没有一个可以像你描述的那样拆分你的数据,因为你如何分解现有字符串是如此依赖于你的实现。
Liquibase允许您在1.9中创建自定义更改类(http://www.liquibase.org/manual/custom_refactoring_class)以及在2.0(http://liquibase.org/extensions)中提供更强大的自定义更改支持。它是基于java的,因此您的脚本需要用java编写,但您可以进行任何所需的数据读取和操作。
注意:如果您有大量数据,将记录读入java,那么将它们写回来会很慢。在这种情况下,您可以使用liquibase的标记并创建将在数据库中进行拆分的基于数据库的sql语句和/或存储过程。 Liquibase仍然非常有助于跟踪拆分已经完成,不应该再次进行。
答案 1 :(得分:1)
如果要编写自定义SQL,也可以使用dbdeploy。 Liquibase也支持编写自定义SQL,有DBMaintain或iBatis Migrator。