我用flyway-maven-plugin做了一些实验。我不是一个空的数据库,所以我需要一个初始的ddl脚本。我按照flyway wiki中的说明进行操作:
我在 src / main / resources / db / migration 中放了名为 V1__Base_Migration.sql 的sql脚本。
flyway-maven-plugin的配置如下所示:
<build>
<plugins>
<plugin>
<groupId>com.googlecode.flyway</groupId>
<artifactId>flyway-maven-plugin</artifactId>
<version>1.7</version>
<configuration>
<driver>org.hsqldb.jdbcDriver</driver>
<url>jdbc:hsqldb:hsql://localhost:9001/testdb</url>
<user>SA</user>
<password></password>
<schemas>PUBLIC</schemas>
<initialVersion>1</initialVersion>
<initialDescription>Base Migration</initialDescription>
</configuration>
</plugin>
</plugins>
</build>
当我在cmd上调用mvn install flyway:init
并在数据库中查看运行时,我可以找到flyway的版本表,但不能找到其ddl在sql脚本中的表。
当我查看Maven的调试日志时,我找不到运行sql脚本的任何提示。
[DEBUG] Excluded: classworlds:classworlds:jar:1.1
[DEBUG] Configuring mojo com.googlecode.flyway:flyway-maven-plugin:1.7:init from plugin realm ClassRealm[plugin>com.googlecode.flyway:flyway-maven-plugin:1.7, parent: sun.misc.Launcher$AppClassLoader@11799e7]
[DEBUG] Configuring mojo 'com.googlecode.flyway:flyway-maven-plugin:1.7:init' with include-project-dependencies configurator -->
[DEBUG] (f) driver = org.hsqldb.jdbcDriver
[DEBUG] (f) initialDescription = Base Migration
[DEBUG] (f) initialVersion = 1
[DEBUG] (f) schemas = PUBLIC
[DEBUG] (f) settings = org.apache.maven.execution.SettingsAdapter@1aa246e
[DEBUG] (f) url = jdbc:hsqldb:hsql://localhost:9001/testdb
[DEBUG] (f) user = SA
[DEBUG] -- end configuration --
[DEBUG] Database: HSQL Database Engine
[INFO] Hsql does not support locking. No concurrent migration supported.
[DEBUG] Schema: PUBLIC
[INFO] Creating Metadata table: schema_version (Schema: PUBLIC)
[DEBUG] Found statement at line 17: CREATE TABLE PUBLIC.schema_version (
version VARCHAR(20) PRIMARY KEY,
description VARCHAR(100),
type VARCHAR(10) NOT NULL,
script VARCHAR(200) NOT NULL,
checksum INT,
installed_by VARCHAR(30) NOT NULL,
installed_on TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
execution_time INT,
state VARCHAR(15) NOT NULL,
current_version BIT NOT NULL,
CONSTRAINT PUBLIC.schema_version_script_unique UNIQUE (script)
);
[DEBUG] Found statement at line 30: CREATE INDEX PUBLIC.schema_version_current_version_index ON PUBLIC.schema_version (current_version);
[DEBUG] Executing SQL: CREATE TABLE PUBLIC.schema_version (
version VARCHAR(20) PRIMARY KEY,
description VARCHAR(100),
type VARCHAR(10) NOT NULL,
script VARCHAR(200) NOT NULL,
checksum INT,
installed_by VARCHAR(30) NOT NULL,
installed_on TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
execution_time INT,
state VARCHAR(15) NOT NULL,
current_version BIT NOT NULL,
CONSTRAINT PUBLIC.schema_version_script_unique UNIQUE (script)
)
[DEBUG] Executing SQL: CREATE INDEX PUBLIC.schema_version_current_version_index ON PUBLIC.schema_version (current_version)
[DEBUG] Metadata table created: schema_version (Schema: PUBLIC)
我做错了吗?如果有人可以给我一个暗示,我做错了,那会很酷。
您可以在[github]中找到整个Maven测试项目(https://github.com/skosmalla/flyway-maven-test)
致以最诚挚的问候,
桑德拉
答案 0 :(得分:2)
flyway:当您的生产模式中有现有表(例如ABC和XYZ)时,init非常有用,您决定开始使用Flyway来管理数据库的生命周期。
你可以在sql脚本中转储生产模式的结构,比如说V0_9__Prod.sql
在本地执行。这样,您可以将dev DB与PROD中的当前结构对齐。在添加功能时,您可以添加其他迁移,例如V1__Base_Migration.sql
。
虽然部署到PROD时,您不希望V0_9__Prod.sql
再次运行。
为避免这种情况,您可以使用flyway:使用0.9初始化PROD模式。
当它运行迁移时,它将跳过V0_9__Prod.sql
并直接转到V1__Base_Migration.sql
。
如果这种情况不适合您,您只需运行flyway:migrate 即可。不需要flyway:首先是init。