【问题标题】:Cannot populate database with liquibase无法使用 liquibase 填充数据库
【发布时间】:2020-11-20 00:36:31
【问题描述】:

我正在构建一个小型 spring-boot 应用程序。我正在使用 spring-data-jpa 创建数据库架构,并使用 liquibase 来填充测试数据。

application.properties:

spring.datasource.url=jdbc:postgresql://localhost:5432/book-db
spring.datasource.driver-class-name=org.postgresql.Driver

spring.datasource.username=admin
spring.datasource.password=lTIDDYz3n3jD3BeYaAJz
spring.jpa.generate-ddl=true
spring.jpa.hibernate.ddl-auto=create
spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation=true

根据文档,如果我在默认路径下有 gradle 依赖项和 master changeLog,则不需要配置 liquibase。

db.changelog-master.yaml:

databaseChangeLog:
      - changeSet:
            id: 1
            author: jb
            changes:
            - sqlFile:
                  path: db/migration/insert-books.sql

插入-books.sql:

--liquibase formatted sql
--changeset admin:1
delete from book;
insert into book (id, title)
values (nextval('seq'), 'Functional Programming for Mortals');
commit;

我已经尝试过使用和不使用commit。表 databasechangelogdatabasechangelog 已成功创建并包含迁移(插入书籍)。

迁移完成,因为如果我添加无效插入(到某些不存在的表),我会得到异常:

ERROR: relation "xxx" does not exist

如何使用 liquibase 在 insert-books.sql 脚本中填充数据?

【问题讨论】:

    标签: java spring-boot hibernate spring-data-jpa liquibase


    【解决方案1】:

    不要同时使用 liquibase 和 JPA 来管理数据库结构。如果您想使用 liquibase,请将 JPA (Hibernate) 设置为仅验证架构并在 liquibase 中管理架构。

    spring.jpa.hibernate.ddl-auto=validate
    

    您的解决方案的问题在于操作顺序。当您的应用程序启动时,它首先运行插入数据的 liquibase,然后启动 JPA 并从头开始创建架构。

    尝试在运行应用程序之前删除架构,我敢打赌迁移(liquibase)会失败。

    Liquibase 必须负责架构,有一种方法可以将 liquibase 添加到现有数据库中,但它再次使 liquibase 成为架构的所有者:

    Using liquibase on the existing database

    【讨论】:

    • 你说得对,谢谢!所以没有办法设置正确的顺序:hibernate schema -> liquibase migrations?
    • 嗯,有,看看我的最新编辑。但你不会喜欢的。
    猜你喜欢
    • 1970-01-01
    • 2019-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-08
    • 2017-12-19
    • 2014-08-17
    相关资源
    最近更新 更多