Понимание миграции в Vapor-Fluent (серверная часть Swift) - PullRequest
0 голосов
/ 02 мая 2019

Я пишу веб-сервис в Swift с использованием фреймворка Vapor.

У меня есть модель с именем Item. По сути, он имеет только свойства name и id.

typealias VaporModel = Content & PostgreSQLModel & Parameter
final class Item: VaporModel {
    var id: Int?
    var name: String
}

После того, как я настроил контроллер для модели и добавил маршруты, когда я нажимаю на запрос Post Item, я получаю ошибку как Model.defaultDatabase is required to use as DatabaseConnectable. Я думаю, что ошибка в том, что я не добавил Item к Migrations в configure.swift, и я делаю то же самое после соответствия Item PostgreSQLMigration.

var migrations = MigrationConfig()
migrations.add(model: Item.self, database: .psql)
services.register(migrations)

Теперь я могу нажать на пост-запрос и создать элементы в базе данных.

Итак, я понимаю, что протокол Migration создает схему по умолчанию для модели и добавляет новую таблицу в базу данных со свойствами модели в виде столбцов.

Теперь я хочу добавить свойство, такое как price, в мой класс Item. Теперь, когда я нажимаю на почтовый запрос, я получаю сообщение об ошибке column "price" of relation "Item" does not exist. Я предполагаю, что протокол миграции сможет идентифицировать изменения схемы и столбец в моей таблице (это то, к чему я привык при использовании Realm для моих приложений iOS). Но я ошибаюсь и читаю документы по миграции и применяю методы миграции prepare и revert, как показано ниже.

extension Item: PostgreSQLMigration {
    static func prepare(on conn: PostgreSQLConnection) -> Future<Void> {
        return Database.create(self, on: conn) { creator in
            creator.field(for: \.price)
        }
    }

    static func revert(on connection: PostgreSQLConnection) -> EventLoopFuture<Void> {
        return Future.map(on: connection) { }
    }
} 

Я все еще поражен той же ошибкой column "price" of relation "Item" does not exist. Что мне здесь не хватает? Правильно ли указан код миграции?

Кроме того, я понимаю, что если я не внесу никаких изменений в модель, я могу закомментировать конфигурацию миграции, поскольку они не должны запускаться каждый раз, когда я запускаю службу. Это правильно?

1 Ответ

2 голосов
/ 02 мая 2019

С вашим кодом вы не добавили новую миграцию. Вы осуществили начальную миграцию вручную, но начальная миграция уже запущена в соответствии с запросом (migrations.add(model: Item.self, database: .psql). Для создания новой миграции вам понадобится что-то вроде:

struct ItemAddPriceMigration: Migration {
    typealias Database = PostgreSQLDatabase

    static func prepare(on conn: PostgreSQLConnection) -> EventLoopFuture<Void> {

        return Database.update(Item.self, on: conn) { builder in
            builder.field(for: \.price)
        }
    }

    static func revert(on conn: PostgreSQLConnection) -> EventLoopFuture<Void> {
        return conn.future()
    }
}

А затем вам нужно добавить его в configure:

migrations.add(migration: ItemAddPriceMigration.self, database: .psql)

...