Microsoft Fabric Data Factory の ODBC コネクタで PostgreSQL データを取得する

## はじめに

PostgreSQL コネクタは Fabric Data Factory でオンプレミスデータゲートウェイをサポート外だったので ODBC 接続を試みたメモ

https://learn.microsoft.com/ja-jp/fabric/data-factory/connector-postgresql-overview

## 注意

2024/9/3 時点で↓のリンクではODBCコネクタのデータパイプラインはサポート外の模様。でも問題なく動く。

https://learn.microsoft.com/ja-jp/fabric/data-factory/connector-odbc-overview

こっちのリンクだとサポートになってる。docsのミスな気もする
https://learn.microsoft.com/ja-jp/fabric/data-factory/pipeline-support

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/c24c53c4-ac72-ecc2-1450-ab52dcb88dfb.png)


## 準備

テーブルはこちら

```sql
-- データベースを作成する（既存のデータベースを使用する場合はこの行をスキップ）
CREATE DATABASE sample_db;

-- 作成したデータベースに接続する
\c sample_db;

-- ordersテーブルを作成する
CREATE TABLE orders (
    order_id SERIAL PRIMARY KEY,        -- 自動インクリメントの注文ID
    customer_id INTEGER NOT NULL,       -- 顧客ID
    order_date DATE NOT NULL,           -- 注文日
    order_amount NUMERIC(10, 2) NOT NULL, -- 注文金額
    order_status VARCHAR(50)            -- 注文ステータス（例：'pending', 'completed', 'cancelled'）
);

-- サンプルデータを挿入する
INSERT INTO orders (customer_id, order_date, order_amount, order_status)
VALUES 
    (1, '2024-09-01', 100.00, 'pending'),
    (2, '2024-09-02', 150.50, 'completed'),
    (1, '2024-09-03', 200.75, 'cancelled');


```

### オンプレミスデータゲートウェイのセットアップ

https://learn.microsoft.com/ja-jp/data-integration/gateway/service-gateway-install

セットアップ済み：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/a1d1299c-38c9-2ed7-6362-2854387520ab.png)



### odbc ドライバー

https://www.postgresql.org/ftp/odbc/ から odbc ドライバーをインストール

今回はこちらをインストール

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/a82dcc8a-f2f4-f4d7-290f-6afd1c98757e.png)

## 検証

### 1. ODBC 接続の作成と確認

odbc 接続マネージャでシステム DSNを追加して作成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/8616accc-dacd-2285-d513-74100553ddb1.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/32ddb48d-29d3-f3ff-d4dc-cae673caa963.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/d01971bf-0110-52de-0157-1b9d40d04635.png)

テストもOK

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/3525ffe6-95b9-dab5-7370-216596a49398.png)

### 2. Fabic 上の接続を作成

[接続とゲートウェイの管理](https://app.fabric.microsoft.com/groups/me/gateways)に移動

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/78bee1b1-df7e-247b-8616-1cafd9565352.png)


:::note info

UI的にはこちら

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/0f538a3c-7ad8-2cfc-dcf6-98f47563dfe5.png)


:::

新規ボタン押して、以下のように入力

接続文字列は dns={odbcマネージャで作成したデータソース名}

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/bdb4972f-b9bc-fa8f-20fe-11be03b6b5f1.png)

成功すると以下のように表示

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/c2965f53-be69-99e2-57c0-fac68859ca9c.png)

### 3. データフロー Gen 2 での取得

データフローの作成画面で、データソースを選択していく

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/47ab85ae-a779-906e-b35d-37603656c7c6.png)

接続文字列を入れると作成した接続が参照される

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/9c7282d8-1fa7-5a3e-1b8d-b5b32e005e54.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/3561943b-060c-d4a5-bc47-a0940686c328.png)

データ同期先を設定する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/3254be13-d87a-0041-4557-fc7b63ed1489.png)

テーブル名を入力

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/52f42361-5975-9aee-896d-808e2c3214fe.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/8b136062-80d5-426f-51bc-1460f4dc54b0.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/4851f255-b133-1f97-a352-13664d9781dd.png)

公開後、データ更新が完了を確認

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/43f31d50-c0df-46c1-eac9-a9f8b82caba7.png)

データがレイクハウスに連携される

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/466cc196-e946-59c4-6aac-fc7ebd48c734.png)

### 4-1. データパイプラインでの取得（レイクハウステーブルに連携）

データパイプライン作成画面にて、コピーアシスタントを使う

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/1776a201-4129-ed06-ff21-45b379605f65.png)

データフローの時と同様に onelake datahub から探すが、先ほど作成した接続が表示されたのでこちらを使う。ちょっと楽になってる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/333b7d80-a385-1125-b416-27b023702342.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/c4529ac0-758d-31bb-3ac3-088e222cd0e9.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/d4c754cd-0add-d3aa-5d31-e8dd4744ca71.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/af49fdf7-d8ae-1ebe-81aa-e3f4a5ee2e97.png)

保存・実行する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/1b42c218-1b5c-53e9-5f32-f543f043ea7e.png)

成功を確認

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/fa9067dc-552f-70bb-a652-ce2d0cadbc4d.png)

データもOK

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/c7e373f8-3cf5-2407-f170-638e0af9ad8a.png)

### 4-2. データパイプラインでの取得（parquet 化）

テーブルのスキーマ変更に強い仕組みを作るため、データレイクにファイルで出力したい。

コピーアクティビティの設定をファイル、parquet に変更。
ファイルは確実に一つにまとまってほしかったのであえて指定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/24086b02-de86-8d81-e0bb-4639ee1fab41.png)

:::note info

今回は以下のようにフォルダを指定

```
@concat(
    'landing/qiita/postgresql/public_orders/run_date=',
    formatDateTime(convertFromUtc(utcnow(),'Tokyo Standard Time'),'yyyyMMdd'),
    '/run_at=',
    formatDateTime(convertFromUtc(utcnow(),'Tokyo Standard Time'),'yyyyMMddHHmmss'
    )
)
```

:::

完了し、データ出力を確認

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/697683c4-9227-f6a9-21c2-edd45ab61184.png)


内容もOK

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/0cc93aaa-65a4-efa2-ce10-2b058a028dfb.png)