天天看點

Kettle案例分享:表和字段的備注資訊同步(從MySQL到Pgsql)

作者:資料地平面

不管是進行資料庫遷移,還是資料倉庫開發,在進行資料同步前,都需要建立對應的表。為了友善後續的使用和開發,在建立表時,需要添加表和字段的備注資訊。

那麼,在進行跨庫操作時,如何同步表和字段的備注資訊呢,本文以從MySQL庫到Pgsql庫同步為例進行分享,使用的工具為Kettle。

一、表備注資訊同步

  • 操作思路

1、擷取需要同步備注資訊的表名稱;

2、根據某一個表名稱,從原資料庫查詢表備注資訊;

3、生成表備注資訊執行腳本,并存入單獨的表中;

4、循環執行第2、3步驟,周遊所有表名稱。

  • 代碼準備

1、擷取表名稱

下面代碼的功能是從目标資料庫查詢表名稱,其中:"pgsql_schema"是命名參數,指PgSQL目标庫的目标模式。

由于ods層的表,都在表名稱前添加了"ods_",是以需要通過"substring(table_name,5)"操作找到原始的表名稱。

select
  substring(table_name,5)  mysql_table_name
from information_schema.tables
where table_schema = '${pgsql_schema}'
and table_name like 'ods_%'           

這篇文章介紹了命名參數的具體使用方法,需要請點選檢視:參數介紹

2、擷取表最大長度

在擷取到原始表名稱的基礎上,統計這些表名稱的最大長度。這是因為PgSQL和MySQL所允許的表名稱最大長度不一樣,有可能存在表名稱截取的情況。

select 
  max(length(substring(table_name,5))) original_table_name_max_long
from information_schema.tables
where table_schema = '${pgsql_schema}'
and table_name like 'ods_%'           

3、擷取表備注資訊

根據擷取到的原始表名稱,從原始資料庫查詢表備注資訊,其中:"mysql_schema"是命名參數,指MySQL目标庫的目标模式;"MYSQL_TABLE_NAME"是變量,指原始表名稱。

SELECT
table_comment
FROM information_schema.TABLES
WHERE table_schema = '${mysql_schema}'
AND substring(table_name,1,${ORIGINAL_TABLE_NAME_MAX_LONG}) = '${MYSQL_TABLE_NAME}'           

這篇文章介紹了變量的具體使用方法,需要請點選檢視:變量介紹

4、生成SQL執行腳本

通過使用拼接函數,生成添加表備注資訊的SQL腳本。

SELECT
CONCAT('COMMENT ON TABLE "public"."ods_' , '${MYSQL_TABLE_NAME}' , '"' ,' IS ' , '''${TABLE_COMMENT}'';')           

5、建立表,儲存執行腳本

提前在資料庫建立一張表,用來儲存生成的執行腳本,下面的例子是在PgSQL庫的"public"模式下建立了一張表。由于表備注資訊可能包含單引号、雙引号、轉義字元等特殊字元,可能會導緻生成的執行腳本不準确,進而導緻整體任務運作中斷,是以這裡沒有直接運作該腳本。

CREATE TABLE "public"."table_comment" (
  "comment_js" varchar(1000) 
);           
  • Kettle執行檔案開發

整體執行檔案如下圖所示,下面一行為作業檔案"table_comment_from_mysql_to_pgsql"的詳細内容。

Kettle案例分享:表和字段的備注資訊同步(從MySQL到Pgsql)

在"get_table_name"(擷取表面清單)這一步中執行了兩個操作,如下圖所示:

Kettle案例分享:表和字段的備注資訊同步(從MySQL到Pgsql)

作業檔案"table_comment_from_mysql_to_pgsql"中的三個轉換對應的具體内容,如下圖所示:

Kettle案例分享:表和字段的備注資訊同步(從MySQL到Pgsql)

輕按兩下下圖中紅色方框内的作業對象,然後在彈出的對話框内勾選"執行每一個輸入行?",進而實作任務的循環執行。

Kettle案例分享:表和字段的備注資訊同步(從MySQL到Pgsql)

在最外層的作業檔案"table_comment_from_mysql_to_pgsql_top"上設定命名參數,指定連接配接的資料庫對象,如下圖所示:

Kettle案例分享:表和字段的備注資訊同步(從MySQL到Pgsql)

在點選運作作業檔案時,如果實際的命名參數取值和預設的不一緻,可以進行手動填寫,如下圖所示:

Kettle案例分享:表和字段的備注資訊同步(從MySQL到Pgsql)

二、表字段備注資訊同步

  • 操作思路

1、擷取需要同步備注資訊的表名稱;

2、根據某一個原始表名稱,擷取對應表的字段名稱清單;

3、根據上一步中擷取的某一個表字段名稱和對應表名稱,擷取對應的表字段備注資訊;

4、生成表字段備注資訊執行腳本,并存入單獨的表中;

5、循環執行第2-4步驟,周遊所有表名稱和表字段名稱。

  • 代碼準備

這裡主要提供新增加的代碼腳本,其他參考本文"表備注資訊同步"部分

1、擷取表字段名稱

select
  column_name 
from information_schema.columns
where table_schema = '${pgsql_schema}'
and table_name = concat('ods_','${MYSQL_TABLE_NAME}')           

2、擷取表字段備注資訊

SELECT 
column_comment
FROM information_schema.COLUMNS
WHERE table_schema = '${mysql_schema}'
AND substring(table_name,1,${ORIGINAL_TABLE_NAME_MAX_LONG}) = '${MYSQL_TABLE_NAME}'
AND column_name = '${COLUMN_NAME}'           

3、生成SQL執行腳本

通過使用拼接函數,生成添加表字段備注資訊的SQL腳本。

SELECT 
CONCAT('COMMENT ON COLUMN "public"."ods_' , '${MYSQL_TABLE_NAME}' , '"."' ,'${COLUMN_NAME}' , '"', ' IS ' , '''${COLUMN_COMMENT}'';')           
  • Kettle執行檔案開發

Kettle腳本的整體結構如下圖所示:

Kettle案例分享:表和字段的備注資訊同步(從MySQL到Pgsql)

總結

本文詳細介紹了資料庫中備注資訊的批量添加方法(MySQL到PgSQL)。需要文中相關示例檔案的話,請關注頭條号後,私信發送“變量和參數”擷取。

如果你也恰巧是從MySQL庫到PgSQL庫同步備注資訊,基本上可以直接使用網盤中的Kettle腳本檔案,但需要做如下調整:

1、根據實際業務,選擇對應的連接配接資料庫;

2、在執行腳本時,根據對應的資料庫模式,為命名參數"pgsql_schema"和"mysql_schema"指派。

繼續閱讀