REST API JSONレスポンスをSQL INSERT文に変換する

ページネーション付きREST API JSONレスポンスをSQL INSERT文に変換する方法を学びます。エンベロープのアンラップ、ページネーション処理、データ抽出、増分インポートパターンを解説します。

Real-World Scenarios

詳細な説明

REST APIレスポンスからSQLへ

実際のAPIレスポンスはフラットな配列であることは稀です。通常、メタデータエンベロープ、ページネーション、ネストされたデータが含まれており、SQL変換の前にアンラップする必要があります。

典型的なAPIレスポンス

{
  "status": "success",
  "data": {
    "users": [
      { "id": 1, "name": "Alice", "created_at": "2024-06-15T09:30:00Z" },
      { "id": 2, "name": "Bob", "created_at": "2024-06-14T14:22:00Z" }
    ]
  },
  "pagination": {
    "page": 1,
    "per_page": 20,
    "total": 152
  }
}

ステップ1:データ配列の抽出

コンバーターはエンベロープから実際のデータを識別して抽出する必要があります。一般的なパターン:

  • response.data -- 標準エンベロープ
  • response.data.users -- 名前付きキーの下にネスト
  • response.results -- 代替の命名
  • response.items -- もう一つの一般的なパターン

ステップ2:SQL生成

INSERT INTO users (id, name, created_at) VALUES
  (1, 'Alice', '2024-06-15T09:30:00Z'),
  (2, 'Bob', '2024-06-14T14:22:00Z');

ページネーションの処理

ページネーション付きAPIの場合、コンバーターは各ページのSQLを生成して結合できます:

-- ページ1
INSERT INTO users (id, name, created_at) VALUES
  (1, 'Alice', '2024-06-15T09:30:00Z'),
  (2, 'Bob', '2024-06-14T14:22:00Z');

-- ページ2(別リクエスト)
INSERT INTO users (id, name, created_at) VALUES
  (3, 'Charlie', '2024-06-13T11:00:00Z'),
  (4, 'Diana', '2024-06-12T08:15:00Z');

APIレスポンス内のネストされたオブジェクト

APIレスポンスにはネストされた関連オブジェクトが含まれることが多いです:

{
  "id": 1,
  "name": "Alice",
  "department": { "id": 10, "name": "Engineering" }
}

コンバーターはフラット化(department_iddepartment_name)するか、別テーブルに正規化できます。

増分インポートパターン

定期的な同期では、タイムスタンプを使用して新しいデータのみを取得します:

-- UPSERTを使用して再取得されたレコードを処理
INSERT INTO users (id, name, created_at) VALUES (...)
ON CONFLICT (id) DO UPDATE SET
  name = EXCLUDED.name,
  created_at = EXCLUDED.created_at;

一般的なAPIプロバイダー

コンバーターはGitHub、Stripe、Shopify、Slack、Twilioなどの人気APIからのレスポンス形式を処理します。それぞれ独自のエンベロープ構造とページネーションスタイルを持っています。

ユースケース

複数のREST APIからデータを集約して中央のSQLデータベースに格納するレポーティングダッシュボードを構築する際、各APIレスポンスをアンラップし、正規化し、INSERT文に変換する必要があります。このパターンはAPIからデータベースへのETLパイプラインの基盤です。

試してみる — JSON to SQL

フルツールを開く