国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Spring Boot中如何使用Flyway進行數(shù)據(jù)庫遷移

這篇具有很好參考價值的文章主要介紹了Spring Boot中如何使用Flyway進行數(shù)據(jù)庫遷移。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

????????在本文中,我們將了解如何使用 Flyway 來管理 Spring Boot 應用程序中的 SQL 數(shù)據(jù)庫架構(gòu)。

????????在本文中,我們將了解如何使用 Flyway 來管理Spring Boot應用程序中的SQL 數(shù)據(jù)庫架構(gòu)。
Flyway是一個數(shù)據(jù)庫遷移工具,它提供遷移歷史和回滾的功能,并允許我們將應用程序的數(shù)據(jù)庫模式相關層與數(shù)據(jù)庫實體層分離。

應用程序設置

我們將使用的 Spring Boot 應用程序可以使用此Spring Initializr鏈接生成。它包含所有必要的依賴項。
下載應用程序并解決依賴關系后,我們將創(chuàng)建一個名為spring-boot-flyway的新 Postgres 數(shù)據(jù)庫,并配置應用程序以連接到它。

清單 2.1?application.properties

spring.datasource.url=jdbc:postgresql://localhost:5432/spring-boot-flyway
spring.datasource.username=demo
spring.datasource.password=demo

默認情況下,F(xiàn)lyway 會在類路徑中的db/migration/目錄中搜索包含用于管理數(shù)據(jù)庫表和記錄的 SQL 語句的遷移文件。?

對于舊版本的庫,我們可能需要在resources/db/migration/?中創(chuàng)建一個名為.keep的空文本文件,以確保該目錄在應用程序啟動期間被編譯并可用,以避免錯誤。

完成此操作后,我們現(xiàn)在可以啟動應用程序并且它應該成功運行。

基本用法

Flyway 的工作方式是,我們在resources/db/migration目錄中創(chuàng)建一個遷移文件,Spring Boot 會自動執(zhí)行遷移腳本,因為我們已經(jīng)在第 2 節(jié)中將 Flyway 依賴項添加到了類路徑中。

清單3.1?V1__Users.sql

CREATE TABLE IF NOT EXISTS users
(
    id    SERIAL,
    email VARCHAR(200) NOT NULL,
    name  VARCHAR(200) NOT NULL,
    PRIMARY KEY (id)
);

讓我們花一點時間來檢查一下清單 3.1 中的代碼片段。文件名V1__Users.sql遵循一定的約定:

  • “?V?”表示這是版本化遷移。
  • V后面的“?1?”是實際版本號。它也可以是“?V1_1?”,這將轉(zhuǎn)換為版本 1.1。
  • 后面是分隔符“?__?”(兩個下劃線)。這會將版本信息與遷移文件的名稱(在本例中為Users )分開。
  • 最后一部分“?.sql?”是擴展名;因此,該文件包含一個簡單的 SQL 語句。

此時,重新啟動應用程序?qū)⒃跀?shù)據(jù)庫中創(chuàng)建用戶表。此外,我們可以看到還有另一個我們沒有顯式創(chuàng)建的表 -?Flyway_schema_history?。

Flyway_schema_history由 Flyway 本身用來跟蹤已應用的遷移如果該表丟失,F(xiàn)lyway 將假設我們是第一次初始化數(shù)據(jù)庫,并按照版本號的順序運行所有遷移。

Flyway_schema_history表存在時,F(xiàn)lyway 將僅應用之前未應用過的較新的遷移文件。這意味著,為了添加新表,我們只需創(chuàng)建具有更新版本號的更新的遷移文件并重新啟動應用程序。

除了使用 SQL 之外,我們還可以使用Java編寫遷移腳本。在Java遷移風格中,我們的遷移文件是Java類,必須擴展抽象BaseJavaMigration類并實現(xiàn)migrate方法。

IDE 通常不希望 Java 類位于resources目錄中,因此我們將在src/main/java中創(chuàng)建一個名為db/migration的新包。非常重要的是要知道這個新包db/migration應該位于src/main/jav目錄中。

讓我們創(chuàng)建一個新的 Java 遷移來添加新表:

清單 3.2?V2__Posts.java?

public class V2__Posts extends BaseJavaMigration {
    @Override
    public void migrate(Context context) throws Exception {
        var sql = """
                CREATE TABLE posts (
                     id SERIAL,
                     author_id INT NOT NULL,
                     post TEXT NOT NULL,
                     created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
                     updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
                     PRIMARY KEY (id)
                );
                """;
        try(var statement = context.getConnection().createStatement()) {
            statement.execute(sql);
        }
    }
}

與 SQL 文件相比,使用 Java 遷移的優(yōu)點是我們可以添加使用普通 SQL 無法實現(xiàn)的自定義邏輯、條件和驗證。例如,我們可以檢查另一個表是否存在或從環(huán)境中獲取某些值等。

正如您現(xiàn)在可能猜到的那樣,是的,可以在同一個代碼庫中混合 SQL 和 Java 風格的遷移,只要我們確保兩種情況下的 Flyway 位置相同。

Flyway配置和定制

到目前為止,我們一直在使用默認的 Flyway 行為。我們可以進一步調(diào)整 Flyway 以滿足我們的需求。例如,我們可以更改遷移文件的默認位置、配置數(shù)據(jù)庫架構(gòu)(也稱為表空間)、將 SQL 遷移前綴從“V”更改為我們想要的任何內(nèi)容等等。

在下面的配置中,我們配置了遷移文件所在的路徑并禁用清理數(shù)據(jù)庫(即刪除所有表)以防止在生產(chǎn)環(huán)境中意外使用。

清單4.1?application.properties:

spring.flyway.locations=classpath:migrations
spring.flyway.clean-disabled=true

該鍵下還有其他可配置屬性spring.flyway,我們可以使用它們來微調(diào)庫的行為。另外,我們可以查閱Flyway 文檔頁面以供參考。

飛行路線回調(diào)

Flyway為我們提供了配置回調(diào)的能力,這些回調(diào)可以在遷移過程的不同階段調(diào)用?;卣{(diào)機制是在遷移生命周期的不同階段執(zhí)行某些操作的便捷方法。?

假設我們有一些默認數(shù)據(jù)想要在應用程序啟動時播種。我們可以簡單地創(chuàng)建一個支持該AFTER_MIGRATE事件的回調(diào)。

清單 5.1?FlywayDatabaseSeeder.java:

public class FlywayDatabaseSeeder implements Callback {

    @Override
    public boolean supports(Event event, Context context) {
        return event.name().equals(Event.AFTER_MIGRATE.name());
    }
    
    @Override
    public void handle(Event event, Context context) {
        try(var statement = context.getConnection().createStatement()) {

            var ADMIN_EMAIL = "superadmin@example.com";
            
            var checkQuery = "SELECT id FROM users WHERE email = %s"
                    .formatted(ADMIN_EMAIL);
            
            statement.execute(checkQuery);
            ResultSet resultSet = statement.getResultSet();
            resultSet.last();

            //return if the seeder has already been executed
            if(resultSet.getRow() >= 0) return;

            var sql = """
                    INSERT INTO users (email, name) VALUES
                    ('%s', 'Super Admin')
                    """.formatted(ADMIN_EMAIL);
            
            statement.execute(sql);
            
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }

    @Override
    public boolean canHandleInTransaction(Event event, Context context) {
        return true;
    }

    @Override
    public String getCallbackName() {
        return FlywayDatabaseSeeder.class.getName();
    }
}

在上面的清單中,在supports方法中,我們聲明只應針對AFTER_MIGRATE事件執(zhí)行此回調(diào),并且在handle方法中,我們概述了插入默認超級管理員用戶(如果尚不存在)的邏輯。

在這之前,我們需要在 SpringBoot 中向 Flyway 注冊回調(diào)類。我們通過創(chuàng)建一個FlywayMigrationStrategybean 來做到這一點。

清單 5.2?SpringBootFlywayApplication.java?

@Bean
public FlywayMigrationStrategy flywayMigrationStrategy() {
	return (flywayOld) -> {

		/*
		 Update the existing autoconfigured Flyway
		 bean to include our callback class
		*/
		Flyway flyway = Flyway.configure()
				.configuration(flywayOld.getConfiguration())
				.callbacks(new FlywayDatabaseSeeder())
				.load();

		flyway.migrate();

	};
}

rg.flywaydb.core.api.callback.Event枚舉中還有其他事件?,我們可以配置Callback類來支持。例如,您可以有一個回調(diào)來支持該AFTER_MIGRATE_ERROR事件并發(fā)送 Slack 通知來提醒工程師。

技巧和竅門

在本地環(huán)境中進行開發(fā)時,您可以從Flyway_schema_history表中刪除遷移條目。

下次啟動應用程序時,您刪除其歷史記錄的遷移將再次執(zhí)行。這樣,您可以更正錯誤或更新架構(gòu),同時仍在本地計算機上進行開發(fā),而無需刪除整個數(shù)據(jù)庫。

此外,在 SpringBoot 中,您可以控制 Flyway 在應用程序啟動時何時執(zhí)行遷移腳本。例如,假設我們不希望在本地環(huán)境中自動執(zhí)行遷移。我們可以執(zhí)行以下操作:

清單6.1?SpringBootFlywayApplication.java:

@Bean
public FlywayMigrationStrategy flywayMigrationStrategy(@Value("${spring.profiles.active}") String activeProfile) {
	return (flywayOld) -> {

		/*
		 Update the existing autoconfigured Flyway
		 bean to include our callback class
		*/
		Flyway flyway = Flyway.configure()
				.configuration(flywayOld.getConfiguration())
				.callbacks(new FlywayDatabaseSeeder())
				.load();

		if(!"local".equalsIgnoreCase(activeProfile)) {
			flyway.migrate();
		}

	};
}

結(jié)論

使用數(shù)據(jù)庫遷移工具的優(yōu)點之一是它使數(shù)據(jù)庫架構(gòu)成為應用程序代碼庫的一部分。由于應用程序中有一個中心參考點,因此可以更輕松地跟蹤數(shù)據(jù)庫隨時間的變化。文章來源地址http://www.zghlxwxcb.cn/news/detail-660410.html

到了這里,關于Spring Boot中如何使用Flyway進行數(shù)據(jù)庫遷移的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • Spring Boot 如何整合高性能數(shù)據(jù)庫連接池HikariCP

    Spring Boot 如何整合高性能數(shù)據(jù)庫連接池HikariCP

    當使用Spring Boot整合HikariCP時,您可以更加詳細地配置和優(yōu)化連接池以獲得更好的性能。以下是更詳細的步驟和示例代碼: 步驟1:創(chuàng)建Spring Boot項目 您可以使用Spring Initializr(https://start.spring.io/)創(chuàng)建一個新的Spring Boot項目。確保選擇適合您的需求的依賴項,例如Web和Spring D

    2024年02月05日
    瀏覽(32)
  • Spring Boot MySQL數(shù)據(jù)庫的使用

    Spring Boot MySQL數(shù)據(jù)庫的使用

    目錄 簡介Spring Boot Spring Boot的優(yōu)點 Spring Boot連接數(shù)據(jù)庫 1.添加依賴 1.2開啟連接數(shù)據(jù)庫 1.2.1 如果沒有開啟數(shù)據(jù)庫運行程序的時候會出現(xiàn)這樣的報錯這就是沒有連接數(shù)據(jù)庫,所以我們開啟數(shù)據(jù)庫即可使用。 1.2.2 我的名字是MySQL110所以一會用命令字符開啟數(shù)據(jù)庫的時候用的就是這

    2024年04月10日
    瀏覽(22)
  • Spring Boot實戰(zhàn) | 如何整合高性能數(shù)據(jù)庫連接池HikariCP

    Spring Boot實戰(zhàn) | 如何整合高性能數(shù)據(jù)庫連接池HikariCP

    專欄集錦,大佬們可以收藏以備不時之需 Spring Cloud實戰(zhàn)專欄:https://blog.csdn.net/superdangbo/category_9270827.html Python 實戰(zhàn)專欄:https://blog.csdn.net/superdangbo/category_9271194.html Logback 詳解專欄:https://blog.csdn.net/superdangbo/category_9271502.html tensorflow專欄:https://blog.csdn.net/superdangbo/category_869

    2024年02月08日
    瀏覽(28)
  • 【Spring Boot】JdbcTemplate數(shù)據(jù)連接模板 — 使用JdbcTemplate操作數(shù)據(jù)庫

    成功在Spring Boot項目中集成JdbcTemplate后,如何使用JdbcTemplate數(shù)據(jù)庫連接模板操作數(shù)據(jù)庫呢?接下來以示例演示JdbcTemplate實現(xiàn)學生信息的增、刪、改、查等操作,讓我們在實踐中邊學邊用,更好地理解和吸收。 步驟01 創(chuàng)建實體類。 根據(jù)之前創(chuàng)建的Student表結(jié)構(gòu)創(chuàng)建對應的實體類

    2024年02月12日
    瀏覽(25)
  • Spring Boot使用jasypt處理數(shù)據(jù)庫賬號密碼等數(shù)據(jù)加密問題

    在我們業(yè)務場景中,項目中的application.yml 配置文件比如數(shù)據(jù)庫賬號密碼,的各種鏈接的username,password的值都是明文的,存在一定的安全隱患,可以使用jasypt?加密框架的方式進行明文加密,進而使得我們項目更加安全 注意這里排除了mybatis-plus的包可能是項目中有沖突依賴,

    2024年02月06日
    瀏覽(29)
  • 【Spring Boot】SpringBoot和數(shù)據(jù)庫交互: 使用Spring Data JPA

    在現(xiàn)代應用程序的開發(fā)中,數(shù)據(jù)是核心部分。為了能夠持久化、檢索、更新和刪除數(shù)據(jù),應用程序需要與數(shù)據(jù)庫進行交互。 1.1 為什么需要數(shù)據(jù)庫交互 數(shù)據(jù)持久化 :當你關閉應用程序或者服務器時,你仍希望數(shù)據(jù)能夠保存。數(shù)據(jù)庫提供了一個持久的存儲方案,使得數(shù)據(jù)在關閉

    2024年02月12日
    瀏覽(29)
  • 【Spring Boot】使用XML配置文件實現(xiàn)數(shù)據(jù)庫操作(一)

    SQL映射文件就是我們通常說的mapper.xml配置文件,主要實現(xiàn)SQL語句的配置和映射,同時實現(xiàn)Java的POJO對象與數(shù)據(jù)庫中的表和字段進行映射關聯(lián)的功能。 1.1 mapper.xml的結(jié)構(gòu) 下面就來詳細介紹mapper.xml文件的結(jié)構(gòu)。首先看一個完整的mapper.xml示例:

    2024年02月10日
    瀏覽(31)
  • 基于 Spring Boot+MySQL實現(xiàn)的在線考試系統(tǒng)源碼+數(shù)據(jù)庫,基于不同類型的客觀題,進行自動組卷、批卷等功能的考試系統(tǒng)

    基于 Spring Boot+MySQL實現(xiàn)的在線考試系統(tǒng)源碼+數(shù)據(jù)庫,基于不同類型的客觀題,進行自動組卷、批卷等功能的考試系統(tǒng)

    一個 JAVA 實現(xiàn)的在線考試系統(tǒng),主要實現(xiàn)一套基于不同類型的客觀題,進行自動組卷、批卷等功能的考試系統(tǒng)(沒有主觀題) 后端技術棧 基于 Spring Boot 數(shù)據(jù)庫 MySQL ORM MyBatis MyBatis-plus 緩存 Redis 、guava的LoadingCache 安全 Shiro Excel 導出 easyexcel 日志 slf4j、log4j2 圖片上傳 qiniu 其它工具

    2024年01月22日
    瀏覽(983)
  • Spring Boot進階(52):Spring Boot 如何集成Flyway并初始化執(zhí)行 SQL 腳本?| 超級詳細,建議收藏

    ? ? ? ?在我們的認知中,我們會使用 SVN 或 Git 進行代碼的版本管理。但是,我們是否好奇過,數(shù)據(jù)庫也是需要進行版本管理的呢? ????????在每次發(fā)版的時候,我們可能都會對數(shù)據(jù)庫的表結(jié)構(gòu)進行新增和變更,又或者需要插入一些初始化的數(shù)據(jù)。而我們的環(huán)境不僅僅只

    2024年02月15日
    瀏覽(20)
  • 如何使用PyQt進行數(shù)據(jù)庫操作?

    首先,我們要知道,PyQt是一個非常強大的圖形用戶界面(GUI)開發(fā)庫,它允許我們使用Python語言創(chuàng)建美觀且高度交互的桌面應用程序。然而,對于數(shù)據(jù)庫操作,PyQt并不直接提供此類功能。這需要我們使用其他的數(shù)據(jù)庫庫,例如SQLite、MySQL或PostgreSQL等。 對于新手來說,我建議

    2024年02月11日
    瀏覽(89)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包