Предотвращение миграции паров в новой базе данных - PullRequest
1 голос
/ 15 января 2020

Я создал миграцию для добавления поля в таблицу Postgres, она работает, как и ожидалось, в существующей базе данных. Но когда я хочу запустить тот же сервер steam с новой базой данных, он вылетает при миграции с сообщением «поле уже существует», что, конечно, понятно. Но как сохранить код сервера, чтобы он мог работать как с существующими, так и с новыми базами данных?

Fatal error: Error raised at top level: PostgreSQL Error: column "the_coloumn" of relation "User" already exists
- id: PostgreSQLError.server.error.check_for_column_name_collision
: file /BuildRoot/Library/Caches/com.apple.xbs/Sources/swiftlang/swiftlang-1100.8.280/swift/stdlib/public/core/ErrorType.swift, line 200

1 Ответ

1 голос
/ 15 января 2020

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

Однако, если вам нужно иметь оба варианта, вам придется заменить использование AddProperties в исходной миграции, которая создает таблица с явным списком полей, за исключением того, которое вы добавляете во второй миграции. Примеры создания отдельных полей:

extension User:Migration
{
    static func prepare(on connection:MySQLConnection) -> Future<Void>
    {
        return Database.create(self, on:connection)
        {
            builder in
            builder.field(for:\.id, isIdentifier:true)
            builder.field(for:\.surname, type:.varchar(30, characterSet:nil, collate:nil))
            builder.field(for:\.firstName, type:.varchar(30, characterSet:nil, collate:nil))
        }
    }
}

Это создаст таблицу в том виде, в каком она была у вас ранее при создании таблицы в исходной базе данных. Тогда ваша вторая миграция будет работать как прежде. См. https://docs.vapor.codes/3.0/fluent/migrations/ для получения дополнительной информации.

...