Изменить поле VARCHAR через миграцию в Vapor Fluent-MySQL

Я использую Vapor 3 а также FluentMySQL для моего нового проекта и хочу изменить максимальную длину поля (varchar(N)через миграцию. Как я могу это сделать?

У меня есть модель по имени Word в моем проекте и одно из его полей sourceIdentifier то есть String и имеют максимальную длину 12. Модель примерно такая:

final class Word: MySQLModel {
    ...other properties

    var sourceIdentifier: String

    ...other properties
}

Сначала я подумал, что 5 достаточно для поля, и использовал этот код для создания Table для этой модели:

static func prepare(on conn: MySQLConnection) -> Future<Void> {
    return MySQLDatabase.create(Word.self, on: conn) { builder in
        ...other fields...

        builder.field(for: \.sourceIdentifier, type: .varchar(5, characterSet: nil, collate: nil))

        ...other fields...
    }
}

Как вы видите выше, таблица создана с полем sourceIdentifier и его тип .varchar(5, characterSet: nil, collate: nil),

Теперь я хочу увеличить максимальную длину поля с помощью миграции.

Я тоже пробовал MySQLDatabase.update как это:

static func prepare(on conn: MySQLConnection) -> Future<Void> {
    return MySQLDatabase.update(Word.self, on: conn) { builder in
        builder.field(for: \.sourceIdentifier, type: .varchar(12, characterSet: nil, collate: nil))
    }
}

и это не сработало; Ничего не случилось.

Как я могу изменить структуру таблицы через Vapor, FluentMySQL а миграции?

1 ответ

Вы можете сделать что-нибудь с сырым запросом, как это

static func prepare(on conn: MySQLConnection) -> Future<Void> {
    return conn.raw("ALTER TABLE emp MODIFY COLUMN name VARCHAR(100);").run()
}

Вы можете попробовать это.

static func prepare(on conn: MySQLConnection) -> Future<Void> {
  return Database.create(self, on: connection) { builder in
    builder.field(for: \.id, type: .bigint(20), .primaryKey)
    builder.field(for: \.fieldA, type: .varchar(12))
    builder.field(for: \.fieldB, type: .bigint(20))
  }
}

Вместо того, чтобы использовать addProperties(to:) чтобы добавить все поля в базу данных, вы можете использовать field(for:type:_:) добавлять поля вручную.

Другие вопросы по тегам