將 Spanner 與 Liquibase 整合

本頁面說明如何使用 Liquibase 管理 GoogleSQL 方言資料庫和 PostgreSQL 方言資料庫的 Spanner 資料庫結構定義變更。

Liquibase 是開放原始碼的資料庫獨立程式庫,可用於追蹤、管理及套用資料庫結構定義變更。它支援 SQL 和宣告式格式,例如 XML、YAML 和 JSON。

Liquibase 可指定 Spanner 資料庫。但支援所有 Spanner 功能,但有部分限制。

  • 如要查看一般限制,請參閱「限制」。
  • 如要查看 PostgreSQL 方言資料庫的其他資訊 (例如 Liquibase 需求、支援的變更類型和限制),請參閱 PGAdapter 和 Liquibase

安裝 Liquibase

如要在 GoogleSQL 方言資料庫中使用 Liquibase,您必須安裝 Spanner Liquibase 擴充功能。針對 PostgreSQL 方言資料庫,Liquibase 可使用內建的 PostgreSQL 支援功能,並搭配使用 PGAdapter

GoogleSQL

  1. 請按照 Liquibase 說明文件中的操作說明安裝及設定 Liquibase,並擷取資料庫快照。在 liquibase.properties 設定檔中,將 url 屬性設為以下值。
 jdbc:cloudspanner:/projects/PROJECT/instances/INSTANCE/databases/DATABASE
 
Your `liquibase.properties` configuration file can contain only this
property. Other properties are optional.
  1. 前往 GitHub 上的 Spanner Liquibase Extension 版本頁面,然後選取最新版本

  2. 選取並下載名稱為 liquibase-spanner-x.y.z-all.jar 的 JAR 檔案,其中 x.y.z 代表擴充功能的版本號碼。例如:liquibase-spanner-4.17.0-all.jar

  3. 將下載的 JAR 檔案放在 Liquibase 程式庫目錄中。JAR 檔案包含擴充功能、Spanner SDK 和 Spanner JDBC 驅動程式。

PostgreSQL

  1. 請確認 PGAdapter 已在安裝 Liquibase 的電腦上啟動並執行。詳情請參閱「啟動 PGAdapter」。

  2. 請按照 Liquibase 說明文件中的操作說明安裝及設定 Liquibase,並擷取資料庫快照。

liquibase.properties 設定檔中,將 url 屬性設為以下內容。

  jdbc:postgresql://localhost:5432/DATABASE_NAME?options=-c%20spanner.ddl_transaction_mode=AutocommitExplicitTransaction
  

liquibase.properties 設定檔只能包含這項屬性。其他屬性則為選用屬性。

url 字串必須包含 options=-c%20spanner.ddl_transaction_mode=AutocommitExplicitTransaction,因為 Spanner 不支援 DDL 交易,這可確保 DDL 交易會轉換為 DDL 批次。詳情請參閱「PGAdapter 的 DDL 選項」。

查看 Liquibase 範例

GoogleSQL

GoogleSQL Liquibase 擴充功能隨附的變更記錄檔範例 changelog.yaml 展示了 Liquibase 的許多功能,以及如何搭配 Spanner 使用這些功能。

PostgreSQL

PGAdapter 和 Liquibase GitHub 存放區提供的範例變更記錄檔 dbchangelog.xml 展示了 Liquibase 的許多功能,以及如何搭配 Spanner 使用這些功能。

Liquibase 快速入門

本快速入門導覽課程說明如何使用 Liquibase 將 Singers 資料表新增至資料庫。

事前準備

  • 請確認您已完成前述安裝 Liquibase 的步驟。

  • 建立 Spanner 執行個體。

  • 建立 GoogleSQL 方言資料庫或 PostgreSQL 方言資料庫。

  • 僅適用於 PostgreSQL 方言資料庫:請確認 PGAdapter 已啟動並在與 Liquibase 安裝位置相同的機器上執行。詳情請參閱「啟動 PGAdapter」。

  • 僅限 PostgreSQL 方言資料庫,請使用 create_database_change_log.sql 指令碼建立 databasechangeloglockdatabasechangelog 中繼資料表。您必須建立這些資料表,才能覆寫 Liquibase 在資料庫中自動建立的資料表。這麼做是為了確保這些資料表使用正確的 Spanner PostgreSQL 資料類型。

    您可以使用下列指令執行指令碼:

    psql -h localhost -d DATABASE_NAME -f create_database_change_log.sql
    
  • 請執行下列 gcloud 指令,讓 Spanner Liquibase 擴充功能暫時使用您的 Spanner 使用者憑證存取 API:

    gcloud auth application-default login
    

建立 changelog.yaml

  1. 在您偏好的編輯器中輸入下列 YAML。

    databaseChangeLog:
      - preConditions:
         onFail: HALT
         onError: HALT
    
      - changeSet:
         id: create-singers-table
         author: spanner-examples
         changes:
           - createTable:
              tableName: Singers
              columns:
                -  column:
                    name:    SingerId
                    type:    BIGINT
                    constraints:
                      primaryKey: true
                      primaryKeyName: pk_Singers
                -  column:
                    name:    Name
                    type:    VARCHAR(255)
    

    這個 YAML 定義了名為 Singers 的資料表,其中包含主鍵 SingerId 和名為 Name 的資料欄,用於儲存歌手的名稱。

    針對 PostgreSQL 方言資料庫,建議您將資料表和欄名稱全部設為小寫。詳情請參閱「PostgreSQL 大小寫敏感性」。

    請注意,createTable 變更集必須包含主鍵限制,且主鍵限制的名稱必須為 pk_table_name

  2. 將變更內容儲存為 changelog.yaml

執行 Liquibase

執行下列指令,即可在 changelog.yaml 中套用變更集:

liquibase --changeLogFile changelog.yaml update

Liquibase 會使用您在 liquibase.properties 檔案中定義的網址。如要覆寫檔案中的值,請在上述指令中加入下列引數:

--url URL

驗證變更

先前步驟中的更新會導致 Singer 資料表新增至資料庫。此外,DATABASECHANGELOGDATABASECHANGELOGLOCK 資料表已新增 (GoogleSQL 方言資料庫) 或更新 (PostgreSQL 方言資料庫)。

您可以透過 Google Cloud 主控台或 gcloud CLI 驗證這些資料表是否存在。舉例來說,執行 SQL 查詢 SELECT * FROM INFORMATION_SCHEMA.TABLES 會傳回資料庫中所有資料表的清單。

gcloud spanner databases execute-sql DATABASE_NAME --instance=INSTANCE \
    --sql='SELECT * FROM INFORMATION_SCHEMA.TABLES'

您可以查詢 DATABASECHANGELOG 的內容,查看已套用的變更記錄。

後續步驟