2017-11-14 1 views
2

Ich verwende liquibase-gradle-plugin und Groovy DSL, um die changesets in meiner Datenbank zu übernehmen. Ich habe notwendige Konfigurationen in den Skripten gemacht, wie in der documentation des Plugins. Es gibt auch eine relevant issue, die als Closed markiert wurde und scheint für andere Benutzer zu arbeiten. Die Eigenschaften werden jedoch nicht in meiner SQL-Datei aufgelöst. Ich bin mir nicht sicher, was ich falsch mache. Alle Hinweise werden sehr geschätzt.Liquibase kann changeLogParameters nicht übergeben

Inhalt build.gradle

buildscript { 
    repositories { 
     mavenCentral() 
    } 
    dependencies { 
     classpath "org.liquibase:liquibase-gradle-plugin:1.2.4" 
     classpath group: 'mysql', name: 'mysql-connector-java', version: '6.0.6' 
    } 
} 

apply plugin: 'org.liquibase.gradle' 
liquibase { 
    activities { 
     main { 
      changeLogFile "${project.projectDir}/src/main/db/changelogs.groovy" 
      changeLogParameters([ 
        name : 'foo', 
        category: 'bar' 
      ]) 
      url "jdbc:mysql://localhost/test?nullNamePatternMatchesAll=true" 
      username 'test' 
      password 'test' 
      driver 'com.mysql.jdbc.Driver' 
     } 
    } 
} 

Inhalt changelogs.groovy

databaseChangeLog(logicalFilePath: '/db/changelogs.groovy') { 

    changeSet(id: '1', author: 'abc', runAlways: true) { 

     comment 'Init.' 
     sqlFile(path: 'scripts/init.sql', relativeToChangelogFile: true) 

    } 
} 

Inhalt von init.sql

USE TEST; 

DROP TABLE IF EXISTS MY_TABLE; 

CREATE TABLE MY_TABLE(
    NAME VARCHAR(100), 
    CATEGORY VARCHAR(100) 
); 

INSERT INTO MY_TABLE VALUES ('${name}', '${category}'); 

COMMIT; 

SQL Output:

mysql-sql> select * from my_table; 
+---------+-------------+ 
| NAME | CATEGORY | 
+---------+-------------+ 
| ${name} | ${category} | 
+---------+-------------+ 
1 row in set (0.00 sec) 

Hier hätte ich erwartet, dass die Tabelle 'foo' und 'bar' für Name und Kategorie enthalten würde.

Der Code ist verfügbar unter GitHub.

Antwort

1

Meine beste Vermutung ist, dass Sie diese Zeile ersetzen müssen:

INSERT INTO MY_TABLE VALUES ('${name}', '${category}'); 

mit diesem:

INSERT INTO MY_TABLE VALUES ("${name}", "${category}"); 

Der Unterschied ist, dass die erste Zeile einfache Anführungszeichen verwendet, die Zeichenketten übersetzen. Die zweite Zeile verwendet doppelte Anführungszeichen, die eine String-Interpolation ermöglichen (z. B. String-Vorlagen). Hier

ist ein Zitat von http://groovy-lang.org/style-guide.html

Beachten Sie auch den Unterschied zwischen einfachen Anführungszeichen und doppelte Anführungszeichen in Groovy: Apostrophe immer erstellen Java Strings, ohne Interpolation von Variablen, während doppelte Anführungszeichen entweder erstellen Java Strings oder GStrings, wenn interpolierte Variablen vorhanden sind.

Lesen Sie mehr über einzelne zitiert, in doppelten Anführungszeichen und dreifach zitierte Streicher hier: http://docs.groovy-lang.org/latest/html/documentation/index.html#all-strings

+0

Ich habe das versucht und scheint nicht zu funktionieren. Die Ausgabe scheint die gleiche zu sein. –

+0

Das Problem scheint zu sein, dass die Parameter nicht in die 'changelogs.groovy'-Datei übertragen werden, da beim Versuch, die Werte auszudrucken, das Update einfach fehlschlägt. Ausführung fehlgeschlagen für Task ': update'. > liquibase.exception.LiquibaseException: Unerwarteter Fehler beim Ausführen von Liquibase: Keine solche Eigenschaft: Name für Klasse: org.liquibase.groovel.delegate.ChangeSetDelegate –

+0

Wie wäre es damit?'INSERT IN MY_TABLE VALUES ('' $ {name} '', '' $ {category} '"); ' –

0

wie sieht dies einen Fehler in den neueren Versionen ist. Ich bin in der Lage, die Params in die Changelog-Datei mit der Version 1.1.1 wie angegeben here übergeben, aber dies ist immer noch nicht in die SQL-Datei.

Verwandte Themen