H2 更改约束名称的问题
Problems with H2 changing constraint name
我正在尝试将迁移设置为用于集成测试,但 Flyway 未按预期工作。
这里是 SQL 文件的修改示例,用于展示我在做什么:
第一版:
CREATE TABLE Foobar (
property1 VARCHAR(999) NOT NULL,
property2 VARCHAR(999),
property3 VARCHAR(999),
id INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY,
CONSTRAINT Foobar_pk PRIMARY KEY (id)
);
... CREATED OTHER TABLES
第二个版本:
ALTER TABLE Foobar ADD uuid CHAR(36);
ALTER TABLE Foobar DROP CONSTRAINT Foobar_pk;
ALTER TABLE Foobar DROP COLUMN id;
ALTER TABLE Foobar ADD CONSTRAINT Foobar_pk PRIMARY KEY (uuid)
...
第三版:
--CREATED ANOTHER TABLE
下面是我正在做的迁移 H2 的工作:
private final String JDBC_H2_CONNECTION_STRING = "jdbc:h2:mem:FooBarDB;MODE=PostgreSQL;DB_CLOSE_DELAY=-1";
/**
* Creates the schema of the test database.
*
* @throws SQLException If a SQL error occur.
*/
@Before
public void createSchema() throws SQLException {
final Flyway flyway = new Flyway();
flyway.setDataSource(JDBC_H2_CONNECTION_STRING, "", "");
flyway.setInstalledBy(System.getProperty("user.name"));
flyway.migrate();
}
/**
* Deletes the schema of the test database for posterior use.
*
* @throws SQLException If a SQL error occur.
*/
@After
public void deleteSchema() throws SQLException {
final Flyway flyway = new Flyway();
flyway.setDataSource(JDBC_H2_CONNECTION_STRING, "", "");
flyway.clean();
}
我得到的错误是:
org.flywaydb.core.internal.command.DbMigrate$FlywayMigrateException: SQL State : 90057
Error Code : 90057
Message : Constraint "Foobar_PK" not found; SQL statement:
ALTER TABLE Foobar DROP CONSTRAINT Foobar_pk; ALTER TABLE Foobar DROP COLUMN id [90057-197]
起初似乎是一个SQL问题,但奇怪的是,当直接使用Maven插件与生产数据库一起使用时,迁移发生完美,生产数据库使用PostgreSQL ,它给了我这个 H2 错误。所以我不知道这是 H2 的问题,还是 Flyway 的问题(因为集成测试使用 Java 版本),或者我是否遗漏了在这种特殊情况下我应该做的事情。
直接在 H2 上测试 SQL 并查看目录后,我发现这个特定约束有些奇怪。
而不是 CONSTRAINT Foobar_pk PRIMARY KEY (id)
中明确指定的 Foobar_pk
,而是 CONSTRAINT_F
。所以我觉得这已经不是Flyway的问题了,只是H2的问题。
有人知道吗?谢谢大家!
我正在尝试将迁移设置为用于集成测试,但 Flyway 未按预期工作。
这里是 SQL 文件的修改示例,用于展示我在做什么:
第一版:
CREATE TABLE Foobar (
property1 VARCHAR(999) NOT NULL,
property2 VARCHAR(999),
property3 VARCHAR(999),
id INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY,
CONSTRAINT Foobar_pk PRIMARY KEY (id)
);
... CREATED OTHER TABLES
第二个版本:
ALTER TABLE Foobar ADD uuid CHAR(36);
ALTER TABLE Foobar DROP CONSTRAINT Foobar_pk;
ALTER TABLE Foobar DROP COLUMN id;
ALTER TABLE Foobar ADD CONSTRAINT Foobar_pk PRIMARY KEY (uuid)
...
第三版:
--CREATED ANOTHER TABLE
下面是我正在做的迁移 H2 的工作:
private final String JDBC_H2_CONNECTION_STRING = "jdbc:h2:mem:FooBarDB;MODE=PostgreSQL;DB_CLOSE_DELAY=-1";
/**
* Creates the schema of the test database.
*
* @throws SQLException If a SQL error occur.
*/
@Before
public void createSchema() throws SQLException {
final Flyway flyway = new Flyway();
flyway.setDataSource(JDBC_H2_CONNECTION_STRING, "", "");
flyway.setInstalledBy(System.getProperty("user.name"));
flyway.migrate();
}
/**
* Deletes the schema of the test database for posterior use.
*
* @throws SQLException If a SQL error occur.
*/
@After
public void deleteSchema() throws SQLException {
final Flyway flyway = new Flyway();
flyway.setDataSource(JDBC_H2_CONNECTION_STRING, "", "");
flyway.clean();
}
我得到的错误是:
org.flywaydb.core.internal.command.DbMigrate$FlywayMigrateException: SQL State : 90057
Error Code : 90057
Message : Constraint "Foobar_PK" not found; SQL statement:
ALTER TABLE Foobar DROP CONSTRAINT Foobar_pk; ALTER TABLE Foobar DROP COLUMN id [90057-197]
起初似乎是一个SQL问题,但奇怪的是,当直接使用Maven插件与生产数据库一起使用时,迁移发生完美,生产数据库使用PostgreSQL ,它给了我这个 H2 错误。所以我不知道这是 H2 的问题,还是 Flyway 的问题(因为集成测试使用 Java 版本),或者我是否遗漏了在这种特殊情况下我应该做的事情。
直接在 H2 上测试 SQL 并查看目录后,我发现这个特定约束有些奇怪。
而不是 CONSTRAINT Foobar_pk PRIMARY KEY (id)
中明确指定的 Foobar_pk
,而是 CONSTRAINT_F
。所以我觉得这已经不是Flyway的问题了,只是H2的问题。
有人知道吗?谢谢大家!