Fluent ORM und Models
Persistieren Sie Daten mit Vapors Fluent ORM.
Fluent ORM und Models ist eine kostenlose Swift Academy-Lektion auf CoddyKit. Dies ist Lektion 3 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Swift Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Swift Academy-Kurs umfasst insgesamt 4 Lektionen.
Was ist Fluent?
Fluent ist das ORM von Vapor. Es bildet Swift-Klassen auf Datenbankzeilen ab und unterstützt PostgreSQL, MySQL, SQLite und MongoDB über eine einheitliche API. Sie schreiben Swift, Fluent schreibt SQL.
import Fluent
import VaporEin Modell definieren
Ein Fluent-Modell ist eine final class, die dem Protokoll Model und normalerweise auch Content entspricht. Es definiert ein schema (den Tabellennamen) und eine @ID-Eigenschaft für den Primärschlüssel.
final class Planet: Model, Content {
static let schema = "planets"
@ID(key: .id)
var id: UUID?
init() {}
}Der Property Wrapper @Field
Mit @Field bilden Sie eine gespeicherte Spalte ab. Der Schlüssel ist der Name der Datenbankspalte. Fügen Sie für jede zu persistierende Spalte eine Eigenschaft hinzu.
@Field(key: "name")
var name: String
@Field(key: "diameter_km")
var diameterKm: IntEin vollständiges Modell
Modelle benötigen zusätzlich zum erforderlichen leeren init() einen Memberwise-Initializer, damit Sie Instanzen im Code erstellen können.
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
}
}Migrationen
Eine Migration erstellt oder verändert das Datenbankschema. Sie entspricht dem Protokoll AsyncMigration und implementiert prepare (anwenden) sowie revert (rückgängig machen).
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()
}
}Migrationen registrieren
Fügen Sie Migrationen in Ihrer Konfiguration zu app.migrations hinzu und führen Sie sie anschließend mit app.autoMigrate() oder dem Befehl migrate aus.
app.migrations.add(CreatePlanet())
try await app.autoMigrate()Einen Datensatz speichern
Erstellen Sie eine Modellinstanz und rufen Sie save(on:) mit der Datenbank der Anfrage auf. Fluent führt ein INSERT aus und trägt die generierte id ein.
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
}Datensätze abfragen
Verwenden Sie Model.query(on:), um Abfragen auf Fluent-Art zu erstellen. .all() gibt jede Zeile zurück; bei Bedarf können Sie Filter und Sortierungen verketten.
app.get("planets") { req async throws -> [Planet] in
try await Planet.query(on: req.db).all()
}Filtern und nach ID suchen
find(_:on:) ruft einen Datensatz anhand des Primärschlüssels ab und gibt einen optionalen Wert zurück. Mit filter schränken Sie die Ergebnisse anhand von Spaltenwerten ein.
let earth = try await Planet.query(on: req.db)
.filter(\.$name == "Earth")
.first()
let byId = try await Planet.find(someUUID, on: req.db)Aktualisieren und Löschen
Ändern Sie die Eigenschaften eines abgerufenen Modells und rufen Sie update(on:) auf, oder entfernen Sie es mit delete(on:). Beide Vorgänge werden asynchron in der Datenbank ausgeführt.
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)
}Beziehungen
Fluent modelliert Beziehungen mit Property Wrappers: @Parent und @Child für Eins-zu-eins- und Eins-zu-viele-Beziehungen sowie @Siblings für Viele-zu-viele-Beziehungen. Sie definieren Fremdschlüssel und ermöglichen das vorzeitige Laden mit .with(...).
@Parent(key: "star_id")
var star: Star
// query eagerly loading the parent
Planet.query(on: req.db).with(\.$star).all()Kurzer Test: Fluent
Testen Sie Ihr Verständnis des ORM.
Zusammenfassung: Fluent ORM und Modelle
Sie können jetzt Daten mit Fluent persistieren:
- Definieren Sie eine
final class, dieModelentspricht, mit den Property Wrappers@IDund@Fieldsowie einemschema. - Erstellen Sie Tabellen mit
AsyncMigrationund führen Sie die Migrationen mitautoMigrate()aus. - Verwenden Sie für CRUD-Operationen
save,query(on:),find,updateunddelete. - Modellieren Sie Beziehungen mit
@Parent,@Childund@Siblingsund laden Sie sie mit.withvorzeitig.
Häufig gestellte Fragen
Ist die Lektion „Fluent ORM und Models“ kostenlos?
Ja — der vollständige Text von „Fluent ORM und Models“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Swift Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Swift Academy-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Fluent ORM und Models“?
Persistieren Sie Daten mit Vapors Fluent ORM. Du übst Swift Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um Swift Academy zu starten?
Keine Vorkenntnisse erforderlich. Swift Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 3 von 4.
Wie lange dauert die Lektion „Fluent ORM und Models“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser Swift Academy-Lektion Code schreiben und ausführen?
Ja. Jede Swift Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Routing und Request-Verarbeitung
- Content- und JSON-Codierung
- Fluent ORM und Models
- Middleware und Authentifizierung