久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

怎么把數據庫變更

156次閱讀
沒有評論

共計 3484 個字符,預計需要花費 9 分鐘才能閱讀完成。

這篇文章主要介紹“怎么把數據庫變更”,在日常操作中,相信很多人在怎么把數據庫變更問題上存在疑惑,丸趣 TV 小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”怎么把數據庫變更”的疑惑有所幫助!接下來,請跟著丸趣 TV 小編一起來學習吧!

經過千難萬險的開發,系統終于上線了,進入了更加驚險刺激的捉蟲階段。在修修補補之中,給后人留下一堆屎山之前,我們需要把數據庫給整利索了。

想想吧,我們在開發環境,修改了多個字段的名稱,經歷了測試環境的洗禮,還搞了個預上線接受變更。結果,僅僅在線上忘了操作其中一條 SQL,就前功盡棄。如果你做的是項目類型的工作,客戶半年六個月才升級一次,這些腳本的管理就會亂上加亂。

我們需要把這些數據庫變更,使用 git 這樣的工具管理起來,在系統啟動的時候,能夠自動變更。通過口口相傳,太不可信了。

誰也不想背這個鍋。翻聊天記錄? 有用么? 都是事后諸葛亮。

人和動物的區別,就是使用工具。經常被使用的兩個,有 Liquibase 和 Flyway。但是,Liquibase 的遷移腳本寫起來太復雜,需要花很多時間維護,遠不如 Flyway 這樣的開箱即用 (犧牲跨平臺)。如果你的項目不是非常復雜,對 Liquibase 也不熟悉,建議直接選用 flyway。

一般,數據庫變更,會有下面幾種語句,我們都可以使用 flyway 來完成。

DDL 建表和索引的時候,用到的語句,比如 CREATE、ALTER、DROP 等

DML 就是一些常見的數據操作語句,比如 update、delete、insert

DCL 用來設置和管理權限方面信息的語句,比如 grant、deny、revoke 等

下面,就以 flyway 為例,來看一下數據庫的版本,是如何變更的。

1. flyway migrate

首先,使用 mvn 的命令,創建一個示范項目。

mvn archetype:generate -B \ -DarchetypeGroupId=org.apache.maven.archetypes \ -DarchetypeArtifactId=maven-archetype-quickstart \ -DarchetypeVersion=1.1 \ -DgroupId=foo \ -DartifactId=bar \ -Dversion=1.0-SNAPSHOT \ -Dpackage=foobar

在 pom.xml 文件中加入下面的內容:

build   plugins   plugin   groupId org.flywaydb /groupId   artifactId flyway-maven-plugin /artifactId   version 7.3.1 /version   configuration   url jdbc:h3:file:./target/foobar /url   user sa /user   /configuration   dependencies   dependency   groupId com.h3database /groupId   artifactId h3 /artifactId   version 1.4.200 /version   /dependency   /dependencies   /plugin   /plugins   /build

創建數據庫變更目錄。

mkdir -p src/main/resources/db/migration

創建新的數據庫文件,我們把它叫做第一個版本:src/main/resources/db/migration/V1__Create_person_table.sql

create table PERSON ( ID int not null, NAME varchar(100) not null );

使用 mvn 命令,即可完成數據庫更新。不要怕,這個命令是冪等的。

mvn flyway:migrate

終端將輸出下面的內容:

[INFO] Database: jdbc:h3:file:./target/foobar (H2 1.4) [INFO] Successfully validated 1 migration (execution time 00:00.009s) [INFO] Creating Schema History table:  PUBLIC . flyway_schema_history  [INFO] Current version of schema  PUBLIC :   Empty Schema   [INFO] Migrating schema  PUBLIC  to version 1 - Create person table [INFO] Successfully applied 1 migration to schema  PUBLIC  (execution time 00:00.038s)

下面,我們準備第二個變更,同樣的,我們創建第二版本的文件:src/main/resources/db/migration/V2__Add_people.sql

下面是 SQL 文件的內容:

insert into PERSON (ID, NAME) values (1,  Axel  insert into PERSON (ID, NAME) values (2,  Mr. Foo  insert into PERSON (ID, NAME) values (3,  Ms. Bar

再次執行 mvn flyway:migrate,可以發現第二版本的 DML 信息,已經被寫入到數據庫。

2. 如何工作?

那 flyway 是如何做到冪等的呢? 我們使用 DBeaver 來打開這個 h3 文件。

在 JDBC 連接處,輸入:jdbc:h3:/private/tmp/bar/target/foobar.mv.db; 然后選擇 H2  Embedded 模式。我們發現,數據庫中除了用戶創建的 PERSON 表,還多了一個叫做 flyway_schema_history 的表。

讓我們 see 一 see 里面的內容。使用 mvn flyway:info 命令,能看到相同的內容。

可以看到,這個冪等操作,其實是由一張自動創建的狀態表,來保證的。里面還躺著一個叫做 checksum 的字段,李曼存儲的是一個 CRC32 值,用來判斷你的 SQL 文件是否經過了非法篡改 (篡改后將不予通過)。

捅破了這層窗戶紙,一切神奇的事情忽然就變得豁然開朗。所以如果你想要用 flyway,你的賬戶,應該起碼給 create  table 的權限,否則你就需要手動建這種表。

從上面的 SQL 文件定義,也可以看出來,這些文件,需要遵循一定的規律。大體如上圖所示,包含:

前綴

版本號

分隔符

版本描述

flyway 就是靠這種約定,來進行庫表變更的。所以,要嚴格按照它的要求去命名 Sql 文件。

3. SpringBoot 項目集成

在 pom 中加入 flyway 的坐標??梢钥吹轿覀兪菦]有提供版本號的,說明它已經在 bom 文件中定義過了。而它的 autoconfigure,在 SpringBoot 的 autoconfigure 包里面默認提供了。

dependencies   dependency   groupId org.flywaydb /groupId   artifactId flyway-core /artifactId   /dependency  ...  /dependencies

我們當然要看一下 FlywayProperties 這個文件所定義的配置項??梢钥吹剿那熬Y,就是 spring.flyway。

默認的 DB 變更文件,放在 classpath:db/migration,我們也可以通過 locations 配置自定義一個,比如 classpath:cn/xjjdog/flyway。當然,也可以通過 table 屬性,定義那張 his 表的名稱。url、user、password 這些,也可以提供,把 his 表存儲在和業務表不一樣的地方。如果不提供,將默認使用 datasource 所定義的庫。

所以,最小配置,就是什么都不做,直接把變更文件,扔在變更目錄下面就可以了。

spring: datasource: # jdbc 配置... flyway: enable: true locations: classpath:cn/xjjdog/flyway

到此,關于“怎么把數據庫變更”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注丸趣 TV 網站,丸趣 TV 小編會繼續努力為大家帶來更多實用的文章!

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2023-07-27發表,共計3484字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 上蔡县| 广州市| 泰兴市| 清流县| 平顺县| 五大连池市| 濉溪县| 瑞安市| 蒙城县| 滦南县| 罗城| 布尔津县| 工布江达县| 基隆市| 清流县| 迁西县| 孙吴县| 达孜县| 海林市| 蕉岭县| 玉屏| 平原县| 沅陵县| 夏河县| 福鼎市| 桓台县| 和平县| 信宜市| 兴山县| 崇阳县| 当阳市| 姜堰市| 神农架林区| 罗源县| 巴彦淖尔市| 阜新市| 泰宁县| 大关县| 江油市| 东莞市| 黎城县|