【发布时间】:2017-01-07 05:40:51
【问题描述】:
我不确定这是否可行,但我正在尝试通过 Flyway Java API 以编程方式加载保存在 SQL 文件中的迁移。我有一个 SQL 文件保存在基类路径中(现在为了简单起见)作为 V1__Initial_version.sql 并带有一个简单的表创建语句:
CREATE TABLE test_user (
name VARCHAR(25) NOT NULL, PRIMARY KEY(name)
);
然后在我使用的Java程序中
Flyway flyway = new Flyway();
flyway.setDataSource(jdbc_url, user, password);
int migrations = flyway.migrate(); // Just to check the # of migrations applied
我看到 ClassPathScanner 在类路径中查找有效迁移,但它似乎忽略了 sql 迁移文件。当我从命令行调用 flyway migrate 时,相同的 sql 迁移文件工作正常。我创建了一个 java 类并从 JdbcMigrations 类继承,ClassPathScanner 可以很好地选择它。我需要做什么才能让 Java ClassPathScanner 拾取 .sql 文件并将其用作有效迁移?
更大的画面
也许我一开始就错误地处理了这个问题,所以我将添加我正在尝试做的事情。我正在尝试设置一个测试数据库,我可以在测试之间使用、核对和重建。 IE。 TestA 在表中输入一些内容,然后预测试函数将清理 DB 并重置它,然后 TestB 将有一个干净的 DB 和空表来执行它的测试。我在预测试函数中使用 flyway.clean() 和 flyway.migrate() 但它破坏了 schema_version 表以及其他所有内容,然后迁移不会从以前的基线重建。
感谢任何帮助!谢谢!
【问题讨论】:
-
我不太明白对架构进行核对的意义。数据,是的,但是架构?我会使用 DbSetup (dbsetup.ninja-squad.com)。免责声明:我是作者。
-
你是对的,真的没有必要对架构进行核对。我要做的就是清除数据,但使用 flyway.clear 也会删除我的模式表。我没有看到 flyway 清除数据但保留表和架构的另一种方法。
-
这不是 Flyway 的用途。 Flyway 的工作是进行模式演变。
-
谢谢!这解决了部分麻烦!
-
我的大多数单元测试都使用内存数据库,所以在测试运行后,模式无论如何都消失了(但为了确保表在测试之间为空,我在 @Before 固定方法中使用 JDBC 删除) .
标签: java postgresql database-migration flyway