сравнение баз данных и создание сценария sql с помощью liquibase

Я сравниваю две базы данных с использованием liquibase, интегрированной с ant. Но вывод, который он генерирует, похож на общий формат. Он не дает операторов sql. Может ли кто-нибудь сказать мне, как сравнить две базы данных с помощью liquibase, интегрированной с Ant или утилитой командной строки.

1 ответов


получение операторов SQL, представляющих разницу между двумя базами данных, является двухэтапной операцией:

  1. создать XML-журнал изменений "diff"
  2. генерировать операторы SQL

пример

для этого примера требуется liquibase.свойства (упрощает параметры):

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

можно использовать данные.в XML файл для переноса данных, содержащихся в новых таблицах.

обновление 2:

также можно создание наборов изменений liquibase с помощью groovy.

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)
                }
            }
        }
    }
}