liquibase不生成表DATABASECHANGELOG

时间:2017-01-17 14:14:25

标签: java maven liquibase

我是liquibase的新手,我想在生产中的数据库中使用它。 它是一个小应用程序,但我不想手工创建模式,而是想使用像liquibase这样更专业的东西。

我打算做的是在生产中的当前模式和为新应用程序准备的新模式之间创建更改日志。我已经关注了许多教程,但仍然缺少一些东西。输出changelog.xml总是导入所有模式,并且与现有模式没有区别。我看到liquibase必须创建DATABASECHANGELOG表但我无法在计算机上看到它们。

我做了什么:

  • 在生产中转储当前数据库并在开发计算机上导入
  • 来自核心项目的
  • 添加了liquibase.properties并启动了以下命令:mvn clean resources:resources liquibase:generateChangeLog
  • 这生成了一个包含所有模式的master.xml,但是没有在DB中创建表DATABASECHANGELOG(在注释outputChangeLogFile时创建表DATABASECHANGELOGLOCK,并且LOCKED值为0)
  • http://www.liquibase.org/databases.html
  • 手动创建DATABASECHANGELOG
  • 重新运行命令mvn liquibase:generateChangeLog。仍然没有

pom.xml:

<dependencies>
    ...
    <dependency>
        <groupId>org.liquibase</groupId>
        <artifactId>liquibase-core</artifactId>
        <version>3.5.3</version>
    </dependency>
    <dependency>
        <groupId>org.yaml</groupId>
        <artifactId>snakeyaml</artifactId>
        <version>1.17</version>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.6</version>
    </dependency>
</dependencies>

 <!-- edited build after 1st comment. Still got the problem -->
<build>
    <plugins>
        <plugin>
            <groupId>org.liquibase</groupId>
            <artifactId>liquibase-maven-plugin</artifactId>
            <version>${liquibase.version}</version>
            <configuration>
                <promptOnNonLocalDatabase>true</promptOnNonLocalDatabase>
                <changeLogFile>${project.build.directory}/classes/changelog/db.changelog-master.xml</changeLogFile>
                <propertyFile>src/main/resources/liquibase.properties</propertyFile>
            </configuration>
        </plugin>
    </plugins>
</build>

<!--- old section build, left for history purpose --->
<build>
    <pluginManagement>
        <plugins>
            <plugin>
                <groupId>org.liquibase</groupId>
                <artifactId>liquibase-maven-plugin</artifactId>
                <version>${liquibase.version}</version>
                <configuration>
                    <promptOnNonLocalDatabase>true</promptOnNonLocalDatabase>
                    <changeLogFile>${project.build.directory}/classes/changelog/db.changelog-master.xml</changeLogFile>
                    <propertyFile>src/main/resources/liquibase.properties</propertyFile>
                </configuration>
            </plugin>
        </plugins>
    </pluginManagement>
</build>

liquibase.properties:

url=jdbc:mysql://localhost:3306/my_db
username=user
password=pass
driver=com.mysql.jdbc.Driver
outputChangeLogFile=src/main/resources/liquibase/master.xml

注意:注释outputChangeLogFile使liquibase创建表DATABASECHANGELOGLOCK,但只有这一个。

maven输出:

[INFO] ------------------------------------------------------------------------
[INFO] Building -CORE 0.0.2
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- liquibase-maven-plugin:3.5.3:generateChangeLog (default-cli) @ EDI-CORE ---
[INFO] ------------------------------------------------------------------------
[INFO] Parsing Liquibase Properties File
[INFO]   File: src/main/resources/liquibase.properties
[INFO]   'classpath' in properties file is not being used by this task.
[INFO] ------------------------------------------------------------------------
[INFO] Executing on Database: jdbc:mysql://localhost:3306/my_db
[INFO] Generating Change Log from database root@localhost @ jdbc:mysql://localhost:3306/my_db (Default Schema: edi)
INFO 17/01/17 15:01: liquibase: src\main\resources\liquibase\master.xml exists, appending
WARNING 17/01/17 15:01: liquibase: MySQL does not support a timestamp precision of '19' - resetting to the maximum of '6'
WARNING 17/01/17 15:01: liquibase: MySQL does not support a timestamp precision of '19' - resetting to the maximum of '6'
WARNING 17/01/17 15:01: liquibase: MySQL does not support a timestamp precision of '19' - resetting to the maximum of '6'
[INFO] Output written to Change Log file, src/main/resources/liquibase/master.xml
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------

6 个答案:

答案 0 :(得分:0)

它不支持timestamp的{​​{1}}精度,关于您在'19'中的Data Type

MySQL不支持MySQL的{​​{1}}列。

答案 1 :(得分:0)

由于在属性文件中指定了outputChangeLogFile,所以Liquibase试图根据指定的连接为您创建(via liquibase:generateChangeLog)。尝试在您的liquibase.prperties中使用changeLogFile

url=jdbc:mysql://localhost:3306/my_db
username=user
password=pass
driver=com.mysql.jdbc.Driver
changeLogFile=src/main/resources/liquibase/master.xml

答案 2 :(得分:0)

Liquibase通过更改日志和更改集工作。它首先尝试查找主变更日志文件,然后按顺序执行该文件中提到的变更集。如果您指定了任何数据库连接,则Liquibase将使用该凭据,如果未指定,则可以指定liquibase DB凭据。

请访问liquibase的spring boot文档以获取属性列表-https://docs.spring.io/spring-boot/docs/current/reference/html/appendix-application-properties.html#data-migration-properties

样品液基属性

  liquibase:
    change-log: classpath:db/changelog/db.changelog-master.xml
    enabled: true
    drop-first: false
    liquibase-tablespace: 
    liquibase-schema: 
    default-schema: 

答案 3 :(得分:0)

您当前的问题似乎是:

<块引用>

[当我跑步时]

mvn clean resources:resources liquibase:generateChangeLog

[为什么] liquibase 不生成表 DATABASECHANGELOG?

对此的答案是,Liquibase 使用 DATABASECHANGELOG 表来跟踪哪些变更日志已应用于当前表,因此它仅在 update 和类似命令期间创建。命令 generateChangeLog 不运行任何更改日志,因此无需在 DATABASECHANGELOG 中创建任何条目。

不过,我怀疑这可能不是您的潜在问题。您为什么关心 Liquibase 是否创建 DATABASECHANGELOG

这个问题被编辑过几次了吗?这里的很多答案都没有解决目前的问题。

我想知道您真正的问题是否更像是“当已有一些现有架构到位时,我如何使用 Liquibase 管理架构更改”?如果是这样,教程页面“How to set up Liquibase with an Existing Project and Multiple Environments”会在某种程度上回答这个问题。

GL!

答案 4 :(得分:-1)

据我所知(我也是新手),表DATABASECHAGELOG和DATABASECHANGELOGLOCK由更新选项创建:mvn liquibase:update

答案 5 :(得分:-1)

请仔细检查文件是否已正确缩进以及是否正确编写了诸如changeSet之类的标签