Fluent ORMとモデル
VaporのFluent ORMでデータを永続化します。
「Fluent ORMとモデル」はCoddyKit上の無料Swift Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSwift Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Swift Academyコースには全4レッスンが含まれています。
Fluent とは
Fluent は Vapor の ORM です。Swift のクラスをデータベースの行に対応付け、単一の API で PostgreSQL、MySQL、SQLite、MongoDB をサポートします。Swift で記述すれば、Fluent が SQL を生成します。
import Fluent
import Vaporモデルの定義
Fluent のモデルは、Model に準拠する final class で、通常は Content にも準拠します。schema(テーブル名)と、主キー用の @ID プロパティを宣言します。
final class Planet: Model, Content {
static let schema = "planets"
@ID(key: .id)
var id: UUID?
init() {}
}@Field プロパティラッパー
保存するカラムは @Field で対応付けます。キーはデータベースのカラム名です。永続化するカラムごとにプロパティを 1 つ追加します。
@Field(key: "name")
var name: String
@Field(key: "diameter_km")
var diameterKm: Int完全なモデル
モデルには、コード内でインスタンスを作成できるように、必須の空の init() に加えてメンバー単位のイニシャライザーも必要です。
final class Planet: Model, Content {
static let schema = "planets"
@ID(key: .id) var id: UUID?
@Field(key: "name") var name: String
init() {}
init(id: UUID? = nil, name: String) {
self.id = id
self.name = name
}
}マイグレーション
マイグレーションは、データベースのスキーマを作成または変更します。AsyncMigration に準拠し、適用を行う prepare と、取り消しを行う revert を実装します。
struct CreatePlanet: AsyncMigration {
func prepare(on db: Database) async throws {
try await db.schema("planets")
.id()
.field("name", .string, .required)
.create()
}
func revert(on db: Database) async throws {
try await db.schema("planets").delete()
}
}マイグレーションの登録
設定でマイグレーションを app.migrations に追加し、app.autoMigrate() または migrate コマンドで実行します。
app.migrations.add(CreatePlanet())
try await app.autoMigrate()レコードの保存
モデルのインスタンスを作成し、リクエストのデータベースを指定して save(on:) を呼び出します。Fluent が INSERT を実行し、生成された id を設定します。
app.post("planets") { req async throws -> Planet in
let planet = try req.content.decode(Planet.self)
try await planet.save(on: req.db)
return planet
}レコードのクエリ
Model.query(on:) を使って、流れるようにクエリを構築します。.all() はすべての行を返し、必要に応じてフィルターや並べ替えを連結できます。
app.get("planets") { req async throws -> [Planet] in
try await Planet.query(on: req.db).all()
}ID によるフィルタリングと検索
find(_:on:) は主キーで取得し、オプショナルを返します。filter を使うと、カラムの値で結果を絞り込めます。
let earth = try await Planet.query(on: req.db)
.filter(\.$name == "Earth")
.first()
let byId = try await Planet.find(someUUID, on: req.db)更新と削除
取得したモデルのプロパティを変更して update(on:) を呼び出すか、delete(on:) で削除します。どちらもデータベースに対して非同期で実行されます。
if let planet = try await Planet.find(id, on: req.db) {
planet.name = "Renamed"
try await planet.update(on: req.db)
// or: try await planet.delete(on: req.db)
}リレーションシップ
Fluent では、プロパティラッパーを使ってモデルのリレーションシップを定義します。1 対 1 または 1 対多には @Parent と @Child、多対多には @Siblings を使います。これらは外部キーを定義し、.with(...) による Eager Loading を可能にします。
@Parent(key: "star_id")
var star: Star
// query eagerly loading the parent
Planet.query(on: req.db).with(\.$star).all()クイックチェック:Fluent
ORM に関する理解度を確認しましょう。
まとめ:Fluent ORM とモデル
これで Fluent を使ってデータを永続化できるようになりました。
@IDと@Fieldのプロパティラッパー、およびschemaを持つfinal classのModelを定義します。AsyncMigrationでテーブルを作成し、autoMigrate()で実行します。save、query(on:)、find、update、deleteで CRUD 操作を行います。@Parent、@Child、@Siblingsでモデルのリレーションシップを定義し、.withで Eager Loading を行います。
よくある質問
「Fluent ORMとモデル」レッスンは無料ですか?
はい。「Fluent ORMとモデル」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Swift Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Swift Academyコースには全4レッスンが含まれています。
「Fluent ORMとモデル」で何を学びますか?
VaporのFluent ORMでデータを永続化します。 ブラウザで直接実行するハンズオンコードでSwift Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Swift Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのSwift Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。
「Fluent ORMとモデル」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このSwift Academyレッスンでコードを書いて実行できますか?
はい。すべてのSwift Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- ルーティングとリクエスト処理
- コンテンツとJSONエンコーディング
- Fluent ORMとモデル
- ミドルウェアと認証