Fluent ORM и модели
Сохраняйте данные с помощью Fluent ORM Vapor.
«Fluent ORM и модели» — бесплатный урок Swift Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Swift Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Swift Academy содержит 4 уроков всего.
Что такое Fluent
Fluent — это ORM Vapor. Он сопоставляет классы Swift со строками базы данных и поддерживает PostgreSQL, MySQL, SQLite и MongoDB через единый API. Вы пишете на Swift, а Fluent пишет SQL.
import Fluent
import VaporОпределение модели
Модель Fluent — это final class, соответствующий Model и обычно Content. В ней объявляется schema (имя таблицы) и свойство @ID для первичного ключа.
final class Planet: Model, Content {
static let schema = "planets"
@ID(key: .id)
var id: UUID?
init() {}
}Обёртка свойства @Field
Сопоставьте сохраняемый столбец с помощью @Field. Ключом служит имя столбца в базе данных. Добавьте по одному свойству для каждого столбца, который нужно сохранять.
@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 и заполнит сгенерированный идентификатор.
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()
}Фильтрация и поиск по идентификатору
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 моделирует связи с помощью обёрток свойств: @Parent и @Child для связей один-к-одному и один-ко-многим, а также @Siblings для связей многие-ко-многим. Они определяют внешние ключи и позволяют заранее загружать связанные данные с помощью .with(...).
@Parent(key: "star_id")
var star: Star
// query eagerly loading the parent
Planet.query(on: req.db).with(\.$star).all()Быстрая проверка: Fluent
Проверьте, насколько хорошо Вы понимаете ORM.
Итоги: ORM Fluent и модели
Теперь Вы умеете сохранять данные с помощью Fluent:
- Определяйте
final classModelс обёртками свойств@IDи@Field, а также сschema. - Создавайте таблицы с помощью
AsyncMigrationи запускайте миграции черезautoMigrate(). - Выполняйте CRUD-операции с помощью
save,query(on:),find,updateиdelete. - Моделируйте связи с помощью
@Parent,@Childи@Siblings, заранее загружая данные через.with.
Часто задаваемые вопросы
Урок «Fluent ORM и модели» бесплатный?
Да — полный текст урока «Fluent ORM и модели» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Swift Academy, подпишись на CoddyKit PRO. Курс Swift Academy содержит 4 уроков всего.
Чему я научусь в уроке «Fluent ORM и модели»?
Сохраняйте данные с помощью Fluent ORM Vapor. Ты практикуешь Swift Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Swift Academy?
Предыдущий опыт не требуется. Swift Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.
Сколько времени занимает урок «Fluent ORM и модели»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Swift Academy?
Да. Каждый урок Swift Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Маршрутизация и обработка запросов
- Кодирование содержимого и JSON
- Fluent ORM и модели
- Промежуточное ПО и аутентификация