Flyway用法:迁移概念到底是什么?

问题描述 投票:0回答:2

我查看了 Flyway 示例和文档,并尝试了解它在我的环境中是否有用。 我不清楚以下概念细节:Flyway 如何管理数据库版本之间的更改?它显然不会比较数据库生命实例(请参阅此处的答案:Flyway 可以从数据模型中找出并生成迁移文件吗?

详细来说,我的设置如下所示: 我在编码时创建 SQL 创建和插入脚本(自动和手动)。这意味着我的数据库的每个版本都由许多插入/创建语句表示。 在我的世界中,我通过数据库工具(Oracle 的 sqlplus)执行这些脚本。每次运行都会从头开始设置数据库(!)。

我可以将这些完全相同的脚本一对一地放入 Flyway 的“迁移”路径中吗?如果目标数据库比我执行的最后一个“迁移步骤”旧得多(或者安装时 Flyway 还不存在),会发生什么?

更新:

我从另一位 Flyway 用户那里得到了一些意见:

似乎每个“迁移”(数据库版本)都必须是手写的 SQL/Java 代码,并且仅包含先前数据库“迁移”的“更新”。

如果这是真的,我想知道如何将其与传统编码技术一起使用:在我的世界中,SQL 语句是自动生成的,并且包含所有数据库初始化/创建语句,而不仅仅是对某些先前版本的“更新”。如果我的 SQL 代码生成器可以做到这一点,那么我什至不需要像 Flyway 这样的工具:-)。

flyway
2个回答
4
投票

您关于“如何处理历史比迁移脚本更长的数据库?”的问题您需要创建一个匹配/重新创建最新数据库架构的 V1_ 迁移/sql 脚本。可以将空白数据库变成您今天所拥有的东西。使用现有的数据库工具创建/生成该 sql 脚本,然后将其放入 Flyways 迁移目录中。 (并通过使用 Flyway 针对干净的数据库来测试 V1,看看是否得到了预期的结果。) http://flywaydb.org/documentation/existing.html

在那之后,所有更高版本都必须在您工作时添加。当您决定需要一个新表时,请在您的开发环境中编写一个新的 V*_.sql,将您的架构修改为您需要的方式。

本博客讨论了 Spring/SQL 应用程序的这种情况。 https://blog.synyx.de/2012/10/database-migration-using-flyway-and-spring-and-existing-data/


0
投票
DECLARE
    story_name VARCHAR2(100) := 'Inserting data into SYS_PARM table with ACS Transactions related information';
    expected_pre_result PLS_INTEGER := 0;
    expected_post_result PLS_INTEGER := 7; -- Assuming there are 7 records to be inserted
    prevalidation_failed_msg VARCHAR2(250) := 'Prevalidation for ' || story_name || ' failed. Expected result: ' || expected_pre_result;
    postvalidation_failed_msg VARCHAR2(250) := 'Postvalidation for ' || story_name || ' failed. Expected result: ' || expected_post_result;
    pre_result PLS_INTEGER := 0;
    post_result PLS_INTEGER := 0;
    prevalidation_failed EXCEPTION;
    postvalidation_failed EXCEPTION;
    unexpected_error EXCEPTION;
    PRAGMA EXCEPTION_INIT(prevalidation_failed, -20000);
    PRAGMA EXCEPTION_INIT(postvalidation_failed, -20001);
    PRAGMA EXCEPTION_INIT(unexpected_error, -20002);
BEGIN
    -- Pre-validation SQL: Check the initial count of records in SYS_PARM table
    SELECT COUNT(*) INTO pre_result FROM MCSENDPERF_OWNER.SYS_PARM;
    
    -- Test for expected pre_result
    IF pre_result = expected_pre_result THEN
        -- Insert data into SYS_PARM table
        INSERT INTO MCSENDPERF_OWNER.SYS_PARM (PARM_TYPE_NAM, PARM_NAM, PARM_VAL) VALUES ('PERF_POC_BATCH', 'PARTNER_ID', '123,456,8831');
        INSERT INTO MCSENDPERF_OWNER.SYS_PARM (PARM_TYPE_NAM, PARM_NAM, PARM_VAL) VALUES ('PERF_POC_BATCH', 'AMOUNT', '120');
        INSERT INTO MCSENDPERF_OWNER.SYS_PARM (PARM_TYPE_NAM, PARM_NAM, PARM_VAL) VALUES ('PERF_POC_BATCH', 'PRCSSR_ID', '90000022922');
        INSERT INTO MCSENDPERF_OWNER.SYS_PARM (PARM_TYPE_NAM, PARM_NAM, PARM_VAL) VALUES ('PERF_POC_BATCH', 'DAILY_LIMIT_CURR_NUM_CD_TXT', '986');
        INSERT INTO MCSENDPERF_OWNER.SYS_PARM (PARM_TYPE_NAM, PARM_NAM, PARM_VAL) VALUES ('PERF_POC_BATCH', 'ACT_NUM', '541311313131331');
        INSERT INTO MCSENDPERF_OWNER.SYS_PARM (PARM_TYPE_NAM, PARM_NAM, PARM_VAL) VALUES ('PERF_POC_BATCH', 'MAX_ACS_TRANSACTION_COUNT', '10');
        INSERT INTO MCSENDPERF_OWNER.SYS_PARM (PARM_TYPE_NAM, PARM_NAM, PARM_VAL) VALUES ('PERF_POC_BATCH', 'SNGL_DUAL_MSG_CD', 'SINGLE');
        
        -- Post-validation SQL: Check the count of records in SYS_PARM table after insertion
        SELECT COUNT(*) INTO post_result FROM MCSENDPERF_OWNER.SYS_PARM;
        
        -- Test for expected post_result
        IF post_result = expected_post_result THEN
            -- Post-validation check passed
            DBMS_OUTPUT.PUT_LINE('Data inserted successfully into SYS_PARM table.');
        ELSE
            -- Post-validation check failed
            RAISE_APPLICATION_ERROR(-20001, postvalidation_failed_msg || '. Actual result was ' || post_result);
        END IF;
        
        -- Commit the transaction
        COMMIT;
        DBMS_OUTPUT.PUT_LINE('Change applied');
    ELSE
        -- Pre-validation check failed
        RAISE_APPLICATION_ERROR(-20000, prevalidation_failed_msg || '. Actual result was ' || pre_result);
    END IF;
EXCEPTION
    WHEN prevalidation_failed THEN
        ROLLBACK;
        RAISE;
    WHEN postvalidation_failed THEN
        ROLLBACK;
        RAISE;
    WHEN OTHERS THEN
        ROLLBACK;
        DBMS_OUTPUT.PUT_LINE('Unknown error occurred. Rollback executed');
        RAISE_APPLICATION_ERROR(-20002, 'An unexpected error was encountered for ' || story_name || '. SQLERRM: ' || SQLERRM);
END;
© www.soinside.com 2019 - 2024. All rights reserved.