英文:
Cannot populate database with liquibase
问题
我正在构建一个小的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依赖项并且在默认路径下有主ChangeLog,就不需要为Liquibase进行配置。
db.changelog-master.yaml:
databaseChangeLog:
- changeSet:
id: 1
author: jb
changes:
- sqlFile:
path: db/migration/insert-books.sql
insert-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
和不带commit
。成功创建了表databasechangelog
和databasechangelog
,并包含迁移(insert-books)。
迁移已成功执行,因为如果我添加一个无效的插入(到不存在的表),我会得到异常:
ERROR: relation "xxx" does not exist
如何使用Liquibase在insert-books.sql脚本中填充数据库数据?
英文:
I'm building a small spring-boot application. I'm using spring-data-jpa to create the database schema and liquibase to populate it with test data.
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
According to the documentation no configuration for liquibase is required if I have a gradle dependency and master changeLog under the default path.
db.changelog-master.yaml:
databaseChangeLog:
- changeSet:
id: 1
author: jb
changes:
- sqlFile:
path: db/migration/insert-books.sql
insert-books.sql:
--liquibase formatted sql
--changeset admin:1
delete from book;
insert into book (id, title)
values (nextval('seq'), 'Functional Programming for Mortals');
commit;
I have tried it with and without commit
. The tables databasechangelog
and databasechangelog
are created successfully and contain the migration (insert-books).
The migration goes through, because if I add an invalid insert (to some table that does not exist), I get the exception:
ERROR: relation "xxx" does not exist
How to populate the database with data in insert-books.sql script using liquibase?
答案1
得分: 1
不要同时使用liquibase和JPA来管理数据库结构。如果要使用liquibase,请将JPA(Hibernate)设置为仅验证模式并在liquibase内管理模式。
spring.jpa.hibernate.ddl-auto=validate
您的解决方案存在操作顺序的问题。当应用程序启动时,首先运行liquibase,它插入数据,然后启动JPA,并从头开始创建模式。
尝试在运行应用程序之前删除模式,我敢打赌迁移(liquibase)会失败。
Liquibase必须负责模式,有一种方法可以将liquibase添加到现有的数据库中,但这再次使liquibase成为模式的所有者:
https://stackoverflow.com/questions/16455624/using-liquibase-on-the-existing-database
英文:
Don't use both, liquibase and JPA, to manage the DB structure. If you want to use liquibase, set JPA (Hibernate) to just validate the schema and manage the schema within liquibase.
spring.jpa.hibernate.ddl-auto=validate
The problem with your solution is in the order of operations. When your application starts, it first runs liquibase, which inserts the data, then JPA is started and the schema is created from scratch.
Try dropping the schema before running the app, I bet the migration (liquibase) will fail.
Liquibase has to be in charge of the schema, there is a way to add liquibase to an existing database, but it again makes liquibase the owner of the schema:
https://stackoverflow.com/questions/16455624/using-liquibase-on-the-existing-database
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论