0Pricing
Swift Academy · Урок

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 class Model с обёртками свойств @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 — локальная установка не требуется.

Все уроки этого курса

  1. Маршрутизация и обработка запросов
  2. Кодирование содержимого и JSON
  3. Fluent ORM и модели
  4. Промежуточное ПО и аутентификация
← Назад к Swift Academy