我有一个jhipsterspring启动应用程序,其中我有2个实体,而生成的实体db不是我喜欢的。例如,我的实体有一个通过id连接的关系,但我想通过另一个字段连接它们。
为此,我做的第一件事就是注解掉master.xml中的所有变更日志,我想一步一步地更改数据库。我从我的第一个changelog开始,我生成了另一个changelog并从原始的changesetid和所需的值复制了数据。但当我试着运行mvn时liquibase:update or 运行应用程序时出现以下错误:
liquibase.exception.MigrationFailedException: Migration failed for change set config/liquibase/changelog/20210126_removed_id_from_price.xml::20210126-1::jhipster:
Reason: liquibase.exception.DatabaseException: Table "MATERIAL_PRICE" already exists; SQL statement:
CREATE TABLE PUBLIC.material_price (amount DECIMAL(21, 2) NOT NULL, CONSTRAINT PK_MATERIAL_PRICE PRIMARY KEY (amount)) [42101-200] [Failed SQL: (42101) CREATE TABLE PUBLIC.material_price (amount DECIMAL(21, 2) NOT NULL, CONSTRAINT PK_MATERIAL_PRICE PRIMARY KEY (amount))]
at liquibase.changelog.ChangeSet.execute(ChangeSet.java:646)
at liquibase.changelog.visitor.UpdateVisitor.visit(UpdateVisitor.java:53)
at liquibase.changelog.ChangeLogIterator.run(ChangeLogIterator.java:83)
at liquibase.Liquibase.update(Liquibase.java:202)
at liquibase.Liquibase.update(Liquibase.java:179)
at liquibase.integration.spring.SpringLiquibase.performUpdate(SpringLiquibase.java:366)
at liquibase.integration.spring.SpringLiquibase.afterPropertiesSet(SpringLiquibase.java:314)
at org.springframework.boot.autoconfigure.liquibase.DataSourceClosingSpringLiquibase.afterPropertiesSet(DataSourceClosingSpringLiquibase.java:46)
at io.github.jhipster.config.liquibase.AsyncSpringLiquibase.initDb(AsyncSpringLiquibase.java:118)
at io.github.jhipster.config.liquibase.AsyncSpringLiquibase.lambda$afterPropertiesSet$0(AsyncSpringLiquibase.java:93)
at io.github.jhipster.async.ExceptionHandlingAsyncTaskExecutor.lambda$createWrappedRunnable$1(ExceptionHandlingAsyncTaskExecutor.java:78)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
at java.base/java.lang.Thread.run(Thread.java:834)
Caused by: liquibase.exception.DatabaseException: Table "MATERIAL_PRICE" already exists; SQL statement:
CREATE TABLE PUBLIC.material_price (amount DECIMAL(21, 2) NOT NULL, CONSTRAINT PK_MATERIAL_PRICE PRIMARY KEY (amount)) [42101-200] [Failed SQL: (42101) CREATE TABLE PUBLIC.material_price (amount DECIMAL(21, 2) NOT NULL, CONSTRAINT PK_MATERIAL_PRICE PRIMARY KEY (amount))]
at liquibase.executor.jvm.JdbcExecutor$ExecuteStatementCallback.doInStatement(JdbcExecutor.java:402)
at liquibase.executor.jvm.JdbcExecutor.execute(JdbcExecutor.java:59)
at liquibase.executor.jvm.JdbcExecutor.execute(JdbcExecutor.java:131)
at liquibase.database.AbstractJdbcDatabase.execute(AbstractJdbcDatabase.java:1276)
at liquibase.database.AbstractJdbcDatabase.executeStatements(AbstractJdbcDatabase.java:1258)
at liquibase.changelog.ChangeSet.execute(ChangeSet.java:609)
... 13 common frames omitted
Caused by: org.h2.jdbc.JdbcSQLSyntaxErrorException: Table "MATERIAL_PRICE" already exists; SQL statement:
CREATE TABLE PUBLIC.material_price (amount DECIMAL(21, 2) NOT NULL, CONSTRAINT PK_MATERIAL_PRICE PRIMARY KEY (amount)) [42101-200]
at org.h2.message.DbException.getJdbcSQLException(DbException.java:453)
at org.h2.message.DbException.getJdbcSQLException(DbException.java:429)
at org.h2.message.DbException.get(DbException.java:205)
at org.h2.message.DbException.get(DbException.java:181)
at org.h2.command.ddl.CreateTable.update(CreateTable.java:89)
at org.h2.command.CommandContainer.update(CommandContainer.java:198)
at org.h2.command.Command.executeUpdate(Command.java:251)
at org.h2.jdbc.JdbcStatement.executeInternal(JdbcStatement.java:228)
at org.h2.jdbc.JdbcStatement.execute(JdbcStatement.java:201)
at com.zaxxer.hikari.pool.ProxyStatement.execute(ProxyStatement.java:95)
at com.zaxxer.hikari.pool.HikariProxyStatement.execute(HikariProxyStatement.java)
at liquibase.executor.jvm.JdbcExecutor$ExecuteStatementCallback.doInStatement(JdbcExecutor.java:398)
... 18 common frames omitted
那么,如何生成一个变更日志,从中获取变更呢?我是个刚开始喝酒的人。
以下是我的更改日志:
原件:
<?xml version="1.0" encoding="utf-8"?>
<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 http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.9.xsd
http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd">
<!--
Added the entity MaterialPrice.
-->
<changeSet id="20210124151850-1" author="jhipster">
<createTable tableName="material_price">
<column name="id" type="bigint">
<constraints primaryKey="true" nullable="false"/>
</column>
<column name="amount" type="decimal(21,2)">
<constraints nullable="true" />
</column>
<!-- jhipster-needle-liquibase-add-column - JHipster will add columns here -->
</createTable>
</changeSet>
<changeSet id="20210124151850-1-relations" author="jhipster">
</changeSet>
<!-- jhipster-needle-liquibase-add-changeset - JHipster will add changesets here -->
<!--
Load sample data generated with Faker.js
- This data can be easily edited using a CSV editor (or even MS Excel) and
is located in the 'src/main/resources/config/liquibase/fake-data' directory
- By default this data is applied when running with the JHipster 'dev' profile.
This can be customized by adding or removing 'faker' in the 'spring.liquibase.contexts'
Spring Boot configuration key.
-->
<changeSet id="20210124151850-1-data" author="jhipster" context="faker">
<loadData
file="config/liquibase/fake-data/material_price.csv"
separator=";"
tableName="material_price">
<column name="id" type="numeric"/>
<column name="amount" type="numeric"/>
<!-- jhipster-needle-liquibase-add-loadcolumn - JHipster (and/or extensions) can add load columns here -->
</loadData>
</changeSet>
</databaseChangeLog>
我自己生成的:
<?xml version="1.0" encoding="utf-8"?>
<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 http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.9.xsd
http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd">
<!--
Added the entity MaterialPrice.
-->
<changeSet id="20210126-1" author="jhipster">
<createTable tableName="material_price">
<column name="amount" type="decimal(21,2)">
<constraints primaryKey="true" nullable="false"/>
</column>
<!-- jhipster-needle-liquibase-add-column - JHipster will add columns here -->
</createTable>
</changeSet>
<changeSet id="20210124151850-1-relations" author="jhipster">
</changeSet>
<!-- jhipster-needle-liquibase-add-changeset - JHipster will add changesets here -->
<!--
Load sample data generated with Faker.js
- This data can be easily edited using a CSV editor (or even MS Excel) and
is located in the 'src/main/resources/config/liquibase/fake-data' directory
- By default this data is applied when running with the JHipster 'dev' profile.
This can be customized by adding or removing 'faker' in the 'spring.liquibase.contexts'
Spring Boot configuration key.
-->
<changeSet id="20210124151850-1-data" author="jhipster" context="faker">
<loadData
file="config/liquibase/fake-data/material_price.csv"
separator=";"
tableName="material_price">
<column name="id" type="numeric"/>
<column name="amount" type="numeric"/>
<!-- jhipster-needle-liquibase-add-loadcolumn - JHipster (and/or extensions) can add load columns here -->
</loadData>
</changeSet>
</databaseChangeLog>
暂无答案!
目前还没有任何答案,快来回答吧!