使用 Java 列出所有 Liquibase SQL 類型
一、簡介
在本文中,我們將探討 Liquibase 支援的各種 SQL 資料類型。我們還將研究它們如何在 MySQL、PostgreSQL、Oracle 等資料庫中表示。
2.什麼是Liquibase
Liquibase 是一種開源資料庫架構變更管理工具,可協助追蹤、版本控制和部署資料庫變更。它通常在 Java 應用程式中用於自動執行資料庫遷移。借助 Liquibase,我們可以像管理應用程式程式碼一樣管理資料庫變更。這有助於加速持續整合和交付,並維護對資料庫變更的版本控制。
2.1.在專案中使用 Liquibase
要在我們的專案中使用 Liquibase,我們首先需要在 Maven pom.xml
檔案中新增最新的liquibase-core
依賴項:
<dependency>
<groupId>org.liquibase</groupId>
<artifactId>liquibase-core</artifactId>
<version>4.27.0</version>
</dependency>
Liquibase 支援多種資料庫,例如 MySQL、PostgreSQL、Oracle 等。一旦我們的資料庫準備就緒,我們就利用liquibase.properties
檔案來定義連線設定。屬性檔案包含資料庫主機 URL、連線憑證和驅動程式資訊等欄位:
changeLogFile=db/changelog/db.changelog-master.yaml
url=jdbc:mysql://localhost:3306/mydatabase
username=dbuser
password=dbpassword
driver=com.mysql.cj.jdbc.Driver
接下來是最重要的一步,我們定義一個changelog
檔。
2.2.變更日誌文件
changelog
檔案可作為單一事實來源,並儲存資料庫中隨時間變化的歷史記錄。 changelog
檔案可以是任何格式,最常見的格式是 SQL、XML、JSON 和 YAML。
我們應該注意到,現有資料庫上的變更日誌可以使用 Maven 自動產生:
mvn liquibase:generateChangeLog
讓我們更好地查看changelog
檔案。 changelog
由一系列changesets
集組成,每個變更集都有一個identifier (id)
。單一changeset
描述對資料庫的單獨修改。 Liquibase 支援大量 DML 更改,例如:
-
createTable
-
addColumn
-
dropColumn
-
update
-
insert
-
sql (for custom SQL)
以下是用 XML 編寫的changelog
日誌範例:
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.8.xsd">
<changeSet id="1" author="baeldung">
<createTable tableName="baeldung_articles">
<column name="id" type="int">
<constraints primaryKey="true" nullable="false"/>
</column>
<column name="name" type="varchar(255)"/>
</createTable>
</changeSet>
<changeSet id="2" author="baeldung">
<addColumn tableName="baeldung_authors">
<column name="name" type="varchar(255)"/>
</addColumn>
</changeSet>
</databaseChangeLog>
2.3.單一Changeset
的結構
單一changeset
標頭包含下列屬性:
-
id
:這是標識changeset
所需的強制屬性。這可以是任何字母數字值。 -
author
:此處是changeset
作者的識別碼。 -
context
:這是一個可選字段,主要用於指定它應該運行的環境(開發、生產)。 -
label
:這是另一個可選字段,可用於提供有關變更的附加上下文。
更改本身可以分為幾種類型的資料庫修改。我們可以使用的一些常見更改是:
-
createTable
-
addColumn
-
dropTable
-
insert
Liquibase 為變更日誌下的變更集提供交易支援。因此,如果單一變更集失敗,整個變更日誌將回滾。
3. Liquibase 中的 SQL 資料型別支持
Java 中的 Liquibase 支援大量資料庫。然而,重要的是要承認資料庫以不同的方式支援資料庫資料類型。例如,字元資料類型在多個資料庫中的大小和名稱可能會有所不同。某些資料庫可能本身支援 UUID,而其他資料庫可能依賴字元或字串類型來儲存此類值。
3.1.資料型態統一的需要
Liquibase 提供資料庫變更管理解決方案。因此,Liquibase需要支援資料庫獨立性。只有 Liquibase 能夠在所有支援的資料庫中標準化資料類型,才能實現這一點。無論底層資料庫為何,單一變更集都應該能夠執行。開發人員還應該能夠建立變更集,而不必過度關心它可能運行的資料庫平台。
3.2.資料庫獨立性
Liquibase 透過實作三種解決方案提供真正的資料庫獨立性:
- 標準化資料庫:Liquibase 定義了一組在各種資料庫平台上最廣泛使用的標準資料類型,例如 int、timestamp 和 text。開發人員可以自由地使用這些資料類型,而無需考慮所使用的底層資料庫。
- 資料類型自動轉換: Liquibase 會自動將資料類型轉換為特定於平台的資料類型。例如,
text
Liquibase 類型將自動轉換為 Oracle 資料庫中的clob
和 SQL Server 中的varchar
。 - 可設定: Liquibase 公開了一個額外的可設定參數,
**convert-data-types.**
如果我們不想執行自動資料類型轉換,則可以提供此參數。如果該值為false
,我們必須提供與目標資料庫相符的精確資料類型。
3.3. Liquibase 提供的資料類型
Liquibase 為 SQL 提供了多種開箱即用的資料類型:
bigint, blob, boolean, char, clob, currency, datetime, date, decimal, double, float, int, mediumint, nchar, nvarchar, number, smallint, time, timestamp, tinyint, uuid, varchar.
4. 所有 Liquibase 資料型別的轉換表
Liquibase 管理資料類型的自動轉換。然而,對於開發人員來說,了解資料類型如何根據主機資料庫進行映射仍然是一個很好的做法。在本節中,我們將提供最常用資料類型的映射的詳盡清單:
Liquibase 資料類型 | MySQL | SQLite | 氫2 | Postgres | 資料庫2 | SQL伺服器 | 甲骨文 |
---|---|---|---|---|---|---|---|
BOOLEAN |
BIT(1) |
BOOLEAN |
BOOLEAN |
BOOLEAN |
SMALLINT |
BIT |
NUMBER(1) |
TINYINT |
TINYINT |
TINYINT |
TINYINT |
SMALLINT |
SMALLINT |
TINYINT |
NUMBER(3) |
INT |
INT |
INTEGER |
INT |
INT |
INTEGER |
INT |
INTEGER |
MEDIUMINT |
MEDIUMINT |
MEDIUMINT |
MEDIUMINT |
MEDIUMINT |
MEDIUMINT |
INT |
MEDIUMINT |
BIGINT |
BIGINT |
BIGINT |
BIGINT |
BIGINT |
BIGINT |
BIGINT |
NUMBER(38, 0) |
FLOAT |
FLOAT |
FLOAT |
FLOAT |
FLOAT |
FLOAT |
FLOAT(53) |
FLOAT |
DOUBLE |
DOUBLE |
DOUBLE |
DOUBLE |
DOUBLE PRECISION |
DOUBLE |
FLOAT(53) |
FLOAT(24) |
DECIMAL |
DECIMAL |
DECIMAL |
DECIMAL |
DECIMAL |
DECIMAL |
DECIMAL(18, 0) |
DECIMAL |
NUMBER |
NUMERIC |
NUMBER |
NUMBER |
NUMERIC |
NUMERIC |
NUMERIC(18, 0) |
NUMBER |
BLOB |
LONGBLOB |
BLOB |
BLOB |
BYTEA |
BLOB |
VARBINARY |
BLOB |
FUNCTION |
FUNCTION |
FUNCTION |
FUNCTION |
FUNCTION |
FUNCTION |
FUNCTION |
FUNCTION |
DATETIME |
DATETIME |
TEXT |
TIMESTAMP |
TIMESTAMP WITHOUT TIME ZONE |
TIMESTAMP |
DATETIME |
TIMESTAMP |
TIME |
TIME |
TIME |
TIME |
TIME WITHOUT TIME ZONE |
TIME |
TIME(7) |
DATE |
TIMESTAMP |
TIMESTAMP |
TEXT |
TIMESTAMP |
TIMESTAMP WITHOUT TIME ZONE |
TIMESTAMP |
DATETIME |
TIMESTAMP |
DATE |
DATE |
DATE |
DATE |
DATE |
DATE |
DATE |
DATE |
CHAR |
CHAR |
CHAR |
CHAR |
CHAR |
CHAR |
CHAR(1) |
CHAR |
VARCHAR |
VARCHAR |
VARCHAR |
VARCHAR |
VARCHAR |
VARCHAR |
VARCHAR |
VARCHAR2 |
NCHAR |
NCHAR |
NCHAR |
NCHAR |
NCHAR |
NCHAR |
NCHAR(1) |
NCHAR |
NVARCHAR |
NVARCHAR |
NVARCHAR |
NVARCHAR |
VARCHAR |
NVARCHAR |
NVARCHAR(1) |
NVARCHAR2 |
CLOB |
LONGTEXT |
TEXT |
CLOB |
TEXT |
CLOB |
VARCHAR |
CLOB |
CURRENCY |
DECIMAL |
REAL |
DECIMAL |
DECIMAL |
DECIMAL(19, 4) |
MONEY |
NUMBER(15, 2) |
UUID |
CHAR(36) |
TEXT |
UUID |
UUID |
char(36) |
UNIQUEIDENTIFIER |
RAW(16) |
5. 以程式設計方式列出所有資料類型
我們可以使用Java方法來提取不同SQL類型與Liquibase的兼容性。我們首先建立兩個清單。第一個清單儲存 Liquibase 支援的相容資料庫:
private static List getDatabases() {
return List.of(
new MySQLDatabase(),
new SQLiteDatabase(),
new H2Database(),
new PostgresDatabase(),
new DB2Database(),
new MSSQLDatabase(),
new OracleDatabase(),
new HsqlDatabase(),
new FirebirdDatabase(),
new DerbyDatabase(),
new InformixDatabase(),
new SybaseDatabase(),
new SybaseASADatabase()
);
}
第二個清單儲存了我們要檢查的資料類型的詳盡清單:
private static List<LiquibaseDataType> getDataTypes() {
return List.of(
new BooleanType(),
new TinyIntType(),
new IntType(),
new MediumIntType(),
new BigIntType(),
new FloatType(),
new DoubleType(),
new DecimalType(),
new NumberType(),
new BlobType(),
new DateTimeType(),
new TimeType(),
new TimestampType(),
new DateType(),
new CharType(),
new VarcharType(),
new NCharType(),
new NVarcharType(),
new ClobType(),
new CurrencyType(),
new UUIDType()
);
}
接下來,讓我們迭代提到的 Liquibase 資料類型 ( dataTypes
) 和資料庫類型 ( databases
) 列表,並嘗試將每個 Liquibase 資料類型轉換為每個資料庫的特定於資料庫的資料類型。我們也為每個組合列印資料類型的名稱和資料庫特定類型。此外,我們會優雅地處理異常,以便在出現錯誤時繼續處理:
List<LiquibaseDataType> dataTypes = getDataTypes();
List<AbstractJdbcDatabase> databases = getDatabases();
for (LiquibaseDataType dataTypeInstance : dataTypes) {
try {
LiquibaseDataType dataType = dataTypeInstance;
dataType.finishInitialization("");
System.out.println(dataType.getName());
for (AbstractJdbcDatabase databaseInstance : databases) {
try {
Database database = databaseInstance;
String databaseType = dataType.toDatabaseDataType(database)
.toString();
System.out.println(databaseInstance.getName() + ": " + databaseType);
} catch (Exception e) {
System.err.println("Error initializing database class "
+ databaseInstance.getName() + ": " + e.getMessage());
}
}
System.out.println();
} catch (Exception e) {
System.err.println("Error initializing data type class "
+ dataTypeInstance.getName() + ": " + e.getMessage());
}
}
六、結論
在本文中,我們了解了 Liquibase 如何提供通用資料類型並協助開發人員管理資料庫版本。
與往常一樣,所有程式碼範例都可以在 GitHub 上找到.