grdb について
GRDB.swift を使う Swift 開発者向けのリファレンスです。SQLite に直接アクセスするためのデータベース設定、クエリ、マイグレーション、リアクティブ監視、性能確認を扱います。
主な機能
- 01DatabaseQueue または DatabasePool の設定
- 02SQL と QueryInterface によるクエリ作成
- 03スキーママイグレーションの定義
- 04クエリ結果のリアクティブ監視
- 05クエリとインデックスの性能分析
活用シーン
- 01Swift アプリでの SQLite データベース構成
- 02マイグレーションによるスキーマ更新
- 03クエリ変更に応じた SwiftUI ビュー更新
- 04最適化前のクエリプラン確認
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ johnrogers/ claude-swift-engineering --skill grdbインストール後、Claude Code で/grdbを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/getting-started.mdmigrations.mdperformance.mdqueries.mdvalue-observation.md詳細
GRDB
GRDB.swift を使用した SQLite への直接アクセスです。必要に応じて SQLite のすべての機能を利用できる、型安全な Swift ラッパーです。
リファレンスの読み込みガイド
内容が必要になる可能性が少しでもある場合は、必ずリファレンスファイルを読み込んでください。 パターンを見逃したり、間違えたりするより、あらかじめコンテキストを把握しておくほうが確実です。
| リファレンス | 読み込むタイミング |
|---|---|
| Getting Started | DatabaseQueue または DatabasePool のセットアップ |
| Queries | 生 SQL、Record 型、型安全なクエリの作成 |
| Value Observation | リアクティブクエリ、SwiftUI との統合 |
| Migrations | DatabaseMigrator、スキーマの進化 |
| Performance | EXPLAIN QUERY PLAN、インデックス作成、プロファイリング |
GRDB と SQLiteData の使い分け
| シナリオ | 使用するもの |
|---|---|
| 型安全な @Table モデル | SQLiteData |
| CloudKit 同期が必要 | SQLiteData |
| 複雑な結合(4 つ以上のテーブル) | GRDB |
| ウィンドウ関数(ROW_NUMBER、RANK) | GRDB |
| パフォーマンスが重要な生 SQL | GRDB |
| リアクティブクエリ(ValueObservation) | GRDB |
基本的なワークフロー
- DatabaseQueue(単一接続)または DatabasePool(並行読み取り)を選択します
- DatabaseMigrator でマイグレーションを定義します
- Record 型(Codable、FetchableRecord、PersistableRecord)を作成します
- 生 SQL または QueryInterface でクエリを記述します
- リアクティブな更新には ValueObservation を使用します
要件
- iOS 13+、macOS 10.15+
- Swift 5.7+
- GRDB.swift 6.0+
よくある間違い
-
EXPLAIN PLAN を使わずにパフォーマンスを推測する —
EXPLAIN QUERY PLANを確認せずにクエリが速いか遅いかを判断するのは、当て推量です。最適化の前に、必ず EXPLAIN でクエリをプロファイリングしてください。 -
WHERE 句で使う列にインデックスがない — インデックスのない列で絞り込むクエリは、テーブル全体をスキャンします。大きなテーブルでは、WHERE、JOIN、ORDER BY 句で使用する列にインデックスを作成してください。
-
マイグレーションの順序が不適切 — 順序を入れ替えたり、中間バージョンを飛ばしたりしてマイグレーションを実行すると、スキーマの整合性が損なわれます。マイグレーションは必ず順番に適用し、バージョンを飛ばさないでください。
-
Record の準拠を省略する — Record 型を
PersistableRecordまたはFetchableRecordに正しく準拠させないと、気づかないうちにデータが失われたり、デシリアライズに失敗したりします。必要なプロトコルはすべて正しく実装してください。 -
適切にクリーンアップせず ValueObservation を使う — ビューが表示されなくなったときに ValueObservation のキャンセルを忘れると、メモリーリークや古いデータの購読が発生します。キャンセル可能なオブジェクトを保存し、deinit でクリーンアップしてください。