我正在教自己如何使用Liquibase进行MySQL数据库版本控制和迁移 .
我正在使用Maven和MySQL进行Spring Boot项目来处理数据库 .
我创建了一个包含多个更改日志文件的主更改日志,直到这一点都很好 . 在应用我的第一次迁移时,问题开始创建一个包含id,email,name,created和updated列的简单用户表 .
除了一件事,迁移运行良好 . Liquibase不对所有列应用NOT NULL,更新TIMESTAMP数据类型,也不对CURRENT_TIMESTAMP额外应用NOT NULL,并且还忽略电子邮件列的唯一索引 .
我的第一次尝试是在.xml更改日志上,我认为它可能是.xml格式,因此我将其更改为SQL语法 . 那也行不通 . 我还首先创建了表,然后添加了非null约束并且无效 .
此时我不知道还能做什么,我找不到更好的帖子或文档 .
注意:它应用的唯一“特殊”约束是主键和自动增量,并忽略所有其他功能 .
我会非常感谢我能得到任何帮助!
这是我的liquibase.properties:
url = jdbc:mysql://localhost/skullproject
username = skull
password = skullpass
driver = com.mysql.jdbc.Driver
这是我的迁移XML更改日志:
<changeSet id="1" author="f6rnando">
<createTable tableName="user">
<column autoIncrement="true" name="id" type="BIGINT">
<constraints primaryKey="true" nullable="false" />
</column>
<column name="email" type="VARCHAR(80)">
<constraints nullable="false" />
</column>
<column name="password" type="VARCHAR(80)">
<constraints nullable="false" />
</column>
<column name="name" type="VARCHAR(80)">
<constraints nullable="false" />
</column>
<column name="updated" type="TIMESTAMP" defaultValueComputed="CURRENT_TIMESTAMP">
<constraints nullable="false" />
</column>
<column name="created" type="DATETIME">
<constraints nullable="false" />
</column>
</createTable>
</changeSet>
<changeSet author="f6rnando" id="1491156436761-3">
<addUniqueConstraint columnNames="email"
constraintName="email_UNIQUE" tableName="user" />
</changeSet>
这是我的MySQL更新日志:
--liquibase formatted sql
--changeset f6rnando:1
CREATE TABLE user (
id BIGINT NOT NULL AUTO_INCREMENT,
email VARCHAR(80) NOT NULL,
password VARCHAR(80) NOT NULL,
name VARCHAR(80) NOT NULL,
updated TIMESTAMP NOT NULL DEFAULT current_timestamp,
created DATETIME NOT NULL,
PRIMARY KEY (id),
UNIQUE INDEX email_UNIQUE (email ASC)
);
--changeset f6rnando:2
ALTER TABLE user MODIFY email VARCHAR(80) NOT NULL;
--changeset f6rnando:3
ALTER TABLE user MODIFY password VARCHAR(80) NOT NULL;
在我尝试过的所有方法之后,这总是相同的结果:MySQL Table info
我在MySQL Workbench上运行了CREATE TABLE语句,完全没有问题 . 创建的所有约束都很好:MySQL Table executed on Workbench
1 回答
经过一周的研究和试验,问题是Hibernate配置 . 在我的
application.properties
文件中,我有spring.jpa.hibernate.ddl-auto = create-drop
,这意味着根据@Entity
类,创建数据库,然后在SessionFactory
关闭时删除 . 显然,这会覆盖Liquibase的行为 .要解决此问题,我将
spring.jpa.hibernate.ddl-auto
设置为none
. 然后Liquibase能够按预期行事 .