2017-01-04 3 views
1

Wie automatisch ID von Changeset mit Liquibase generieren?Liquibase: changeset automatisch generieren ID

Ich möchte nicht die ID jedes Änderungssatzes manuell setzen, gibt es eine Möglichkeit, es automatisch zu tun?

+0

Nein, gibt es nicht (zumindest nichts eingebaut) –

+0

Ich bezweifle das wird (kann) funktionieren. Hier ist der Grund: Liquibase kann Ihr Schema erstellen/aktualisieren/etc. Dafür führt er aus, was Sie in seine Änderungsdatei geschrieben haben. Es speichert dann die Änderungen, die es in seiner eigenen Tabelle ausgeführt hat, um zu wissen, was es bereits getan hat. Wenn es bei jedem Neustart der Anwendung eine zufällige ID erzeugte, konnte es nie herausfinden, welche Änderungen bereits ausgeführt wurden und welche nicht. Die einzige Alternative (könnte ich mir vorstellen) besteht darin, in Liquibase src zu graben und die ID eines Hashes des Changesets erzeugen zu lassen (selbst das kann zu Kollisionen führen). Wenn ich Ihre Frage missverstanden habe, lassen Sie mich wissen – pandaadb

+0

Frage - wie geht es Ihnen? Erstellen Sie derzeit Ihre Änderungssets? – SteveDonie

Antwort

0

Ich glaube nicht, dass generierte IDs eine gute Idee sind. Der Grund ist, dass liquibase die changeSet-ID verwendet, um die Prüfsumme zu berechnen (zusätzlich zu dem Autor und fileName). Wenn Sie also ein changeSet zwischen anderen einfügen, ändern sich die Prüfsummen aller nachfolgenden changeSets und Sie erhalten eine Menge Warnungen/Fehler.

Auf jeden Fall kann ich dieser Lösungen denken, wenn Sie noch Ids erzeugen möchten:

  1. erstellen Sie Ihre eigenen ChangeLogParser

Wenn Sie das ChangeLog auf Ihrem eigenen analysieren können Sie die IDs erzeugen wie du willst. Der Nachteil ist, dass Sie ein benutzerdefiniertes Xml-Schema für das ChangeLog bereitstellen müssen. Das Schema von Liquibase hat eine Einschränkung für changeSet-IDs (erforderlich). Mit einem neuen Schema müssen Sie wahrscheinlich eine Menge Optimierungen am Parser vornehmen. Alternativ können Sie ein anderes changeLog-Format (YAML, JSON, Groovy) wählen. Ihre Parser sind möglicherweise leichter anzupassen, da sie diese Schemadefinition nicht benötigen.

  1. Sie einige der Vorverarbeitung

Sie können eine einfache Xslt (XML-Transformation) schreiben, die eine Changelog mit ChangeSet ids erzeugt aus einer Datei, die keine hat.

  1. Verwendung Zeitstempel als Ids

Dies würde mein Rat sein. Es löst nicht die Frage, wie Sie gefragt, aber es ist einfach, konsistent, bietet zusätzliche Informationen und ist eine gute Praxis für andere Datenbank-Migration-Tools sowie http://www.jeremyjarrell.com/using-flyway-db-with-distributed-version-control/

-1

@SteveDonies, danke für Ihre Antworten.

Ich benutze Liquibase mit Springboot-Projekt. Also ich habe konfiguriert:

db.changelog.xml

<?xml version="1.1" encoding="UTF-8" standalone="no"?> 
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.5.xsd"> 

    <property name="smallintvar" value="SMALLINT" dbms="postgresql"/> 
    <property name="smallintvar" value="INT4" dbms="h2"/> 

    <changeSet author="admin" id="5689314789-10"> 
     <createTable tableName="company"> 
      <column autoIncrement="true" name="id" type="BIGSERIAL"> 
       <constraints primaryKey="true" primaryKeyName="company_pkey"/> 
      </column> 

      <column name="activity" type="VARCHAR(255)"/> 
      <column name="address" type="VARCHAR(255)"/> 
     </createTable> 
    </changeSet> 

    <changeSet id="5689314789-11" author="admin"> 
     <createTable tableName="user"> 
     <column name="id" type="bigint" autoIncrement="${autoIncrement}"> 
      <constraints primaryKey="true" nullable="false"/> 
     </column> 
     <column name="login" type="varchar(50)"> 
      <constraints unique="true" nullable="false"/> 
     </column> 
     <column name="password_hash" type="varchar(60)"/> 
     <column name="first_name" type="varchar(50)"/> 
     <column name="last_name" type="varchar(50)"/> 
     <column name="email" type="varchar(100)"> 
      <constraints unique="true" nullable="true"/> 
     </column> 
     </createTable> 
    </changeSet> 
</databaseChangeLog> 

master.xml

<?xml version="1.0" encoding="utf-8"?> 
<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-3.4.xsd"> 
    <include file="classpath:config/liquibase/changelog/db.changelog.xml" relativeToChangelogFile="false"/> 
</databaseChangeLog> 

und so weiter, die alle gut funktionieren, aber ich frage mich, ob es eine Möglichkeit, automatisch zu generieren die ID der Änderung festgelegt.

Verwandte Themen