比较数据库和使用liquibase生成sql脚本
我比较两个数据库使用liquibase集成与ant。 但是它产生的输出就像通用格式。 它不给sql语句。 请谁能告诉我如何比较两个数据库使用liquibase集成ant或命令行工具。
获取表示两个数据库之间差异的SQL语句是一个两步操作:
- 生成XML“diff”更新日志
- 生成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
现在运行以下命令来创buildSQL语句:
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) } } } } }