我正在使用与 ant 集成的 liquibase 比较两个数据库。但它生成的输出就像通用格式。它没有给出 sql 语句。请谁能告诉我如何使用与 ant 或命令行实用程序集成的 liquibase 比较两个数据库。
问问题
14203 次
1 回答
24
获取代表两个数据库之间差异的 SQL 语句是一个两步操作:
- 生成 XML“差异”变更日志
- 生成 SQL 语句
例子
这个例子需要一个liquibase.properties文件(简化了命令行参数):
classpath=/path/to/jdbc/jdbc.jar
driver=org.Driver
url=jdbc:db_url1
username=user1
password=pass1
referenceUrl=jdbc:db_url2
referenceUsername=user2
referencePassword=pass2
changeLogFile=diff.xml
现在运行以下命令来创建 SQL 语句:
liquibase diffChangeLog
liquibase updateSQL > update.sql
liquibase 的一个不错的特性是它还可以生成回滚 SQL:
liquibase futureRollbackSQL > rollback.sql
更新
Liquibase 不会在数据库之间生成数据差异,只会生成模式。但是,可以将数据库数据转储为一系列变更集:
liquibase --changeLogFile=data.xml --diffTypes=data generateChangeLog
可以使用data.xml文件迁移新表中包含的数据。
更新 2:
也可以使用 groovy 生成 liquibase 变更集。
import groovy.sql.Sql
import groovy.xml.MarkupBuilder
//
// DB connection
//
this.class.classLoader.rootLoader.addURL(new URL("file:///home/path/to/h2-1.3.162.jar"))
def sql = Sql.newInstance("jdbc:h2:db/db1","user","pass","org.h2.Driver")
//
// Generate liquibase changeset
//
def author = "generated"
def id = 1
new File("extract.xml").withWriter { writer ->
def xml = new MarkupBuilder(writer);
xml.databaseChangeLog(
"xmlns":"http://www.liquibase.org/xml/ns/dbchangelog",
"xmlns:xsi":"http://www.w3.org/2001/XMLSchema-instance",
"xsi:schemaLocation":"http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-2.0.xsd"
) {
changeSet(author:author, id:id++) {
sql.eachRow("select * from employee") { row ->
insert(tableName:"exmployee") {
column(name:"empno", valueNumeric:row.empno)
column(name:"name", value:row.name)
column(name:"job", value:row.job)
column(name:"hiredate", value:row.hiredate)
column(name:"salary", valueNumeric:row.salary)
}
}
}
}
}
于 2011-12-06T23:20:34.883 回答