ホームページ > バックエンド開発 > Golang > ページネーションを次のレベルへ: Go API での並べ替えとフィルター処理

ページネーションを次のレベルへ: Go API での並べ替えとフィルター処理

Susan Sarandon
リリース: 2025-01-23 00:38:11
オリジナル
885 人が閲覧しました

前回の投稿では、大きな API 応答を管理可能なチャンクに分割する ページネーション に取り組みました。しかし、データの並べ替え方法特定の結果のフィルターをユーザーが制御できるようにしたい場合は、次のステップである 並べ替え に進む準備ができています。 フィルタリング.
これらの機能を追加して、API をさらに強力にしてみましょう。

前のチュートリアルをまだ行っていない場合は、こちらのリンクを参照してください。

並べ替えとフィルタリングが重要な理由

Image description
ページネーションだけでは必ずしも十分とは限りません。ユーザーが最新のアイテム、または特定の期間に作成されたアイテムのみを検索していると想像してください。並べ替えとフィルタリングにより、ユーザーは次のことが可能になります:

- 並べ替え: 結果の順序を選択します (例: 新しいものから古いもの)
- フィルター: 結果を必要なものに絞り込みます (例: 今日作成されたアイテム)

ページネーションと並べ替えおよびフィルタリングを組み合わせることで、よりユーザーフレンドリーな API を作成します。

データベースクエリを拡張する

前回のブログのアイテム テーブルを基に構築していきます。要約すると、スキームは次のとおりです:

CREATE TABLE items (
    id SERIAL PRIMARY KEY,
    name TEXT NOT NULL,
    created_at TIMESTAMP DEFAULT NOW()
);
ログイン後にコピー
ログイン後にコピー

並べ替えの追加

並べ替えとは、結果を順序付けることです。ユーザーが名前または created_at 列で昇順または降順に並べ替えられるようにします。

ステップ 1: 並べ替えパラメーターを受け入れる

ユーザーは 2 つのクエリ パラメータを渡します:

  • sort : 並べ替える列 ( name または created_at )。
  • order : ソート方向 (asc または desc)。

URL の例:

/items?page=1&limit=10&sort=created_at&order=desc
ログイン後にコピー
ログイン後にコピー

ステップ 2: SQL クエリを調整する

並べ替えを含めるように SQL クエリを動的に変更します。

// Extract sort and order query parameters
sort := r.URL.Query().Get("sort")
order := r.URL.Query().Get("order")

// Validate the sort column
validSortColumns := map[string]bool{"name": true, "created_at": true}
if !validSortColumns[sort] {
    sort = "created_at" // Default sort column
}

// Validate the sort order
if order != "asc" && order != "desc" {
    order = "asc" // Default sort order
}

// Modify the SQL query
query := fmt.Sprintf("SELECT id, name, created_at FROM items ORDER BY %s %s LIMIT  OFFSET ", sort, order)
rows, err := db.Query(query, limit, offset)
if err != nil {
    http.Error(w, "Failed to fetch items", http.StatusInternalServerError)
    return
}
ログイン後にコピー
ログイン後にコピー

フィルタリングの追加

フィルタリングにより、ユーザーは検索を絞り込むことができます。たとえば、日付範囲や名前に特定のキーワードを含むアイテムでアイテムをフィルタリングできます。

ステップ 1: フィルタパラメータを受け入れる

次の 2 つのフィルターをサポートします:

  • name : 特定の部分文字列を含むアイテムを検索します。
  • created_after : 特定の日付以降に作成されたアイテムを取得します。

URL の例:

/items?page=1&limit=10&name=Item&created_after=2025-01-10 20:38:57.832777
ログイン後にコピー
ログイン後にコピー

ステップ 2: SQL クエリを調整する

これらのフィルターを処理するために WHERE 条件を追加します。

CREATE TABLE items (
    id SERIAL PRIMARY KEY,
    name TEXT NOT NULL,
    created_at TIMESTAMP DEFAULT NOW()
);
ログイン後にコピー
ログイン後にコピー

拡張された API のテスト

  • 名前の昇順で並べ替えます:
/items?page=1&limit=10&sort=created_at&order=desc
ログイン後にコピー
ログイン後にコピー
  • 特定の日付以降に作成されたアイテムのフィルタリング:
// Extract sort and order query parameters
sort := r.URL.Query().Get("sort")
order := r.URL.Query().Get("order")

// Validate the sort column
validSortColumns := map[string]bool{"name": true, "created_at": true}
if !validSortColumns[sort] {
    sort = "created_at" // Default sort column
}

// Validate the sort order
if order != "asc" && order != "desc" {
    order = "asc" // Default sort order
}

// Modify the SQL query
query := fmt.Sprintf("SELECT id, name, created_at FROM items ORDER BY %s %s LIMIT  OFFSET ", sort, order)
rows, err := db.Query(query, limit, offset)
if err != nil {
    http.Error(w, "Failed to fetch items", http.StatusInternalServerError)
    return
}
ログイン後にコピー
ログイン後にコピー
  • フィルターの組み合わせと並べ替え:
/items?page=1&limit=10&name=Item&created_after=2025-01-10 20:38:57.832777
ログイン後にコピー
ログイン後にコピー

避けるべきよくある間違い

ユーザー入力を検証していません: 任意の列や無効な並べ替え順序を許可すると、データベースが SQL インジェクションの危険にさらされる可能性があります。入力は常に検証してください。

結論/次のステップ

このチュートリアルの完全なコード リポジトリはここにあります

ページネーション、並べ替え、フィルタリングが導入されたことで、API はよりユーザーフレンドリーで柔軟になりました。さらに高度な機能については、以下の追加を検討してください。

  • 大規模なデータセットのカーソルベースのページネーション
  • 複雑な検索のための ファセット フィルタリング

これらの高度なテクニックを探求する次の投稿をお楽しみに!

Golang の概念やプロジェクトなどに関する詳細情報を入手したり、チュートリアルの最新情​​報を入手したりするには、Twitter と GitHub で Siddhesh をフォローしてください。

それまで学び続けてください構築し続けてください ??

以上がページネーションを次のレベルへ: Go API での並べ替えとフィルター処理の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート