使用 AsyncMigration 迁移 Vapor 中的枚举

问题描述 投票:0回答:1

如何使用

enum
迁移
AsyncMigration
?网上有一些使用
EventLoopFuture
进行迁移的示例,但我更喜欢使用 Swift Concurrency。

swift enums fluent vapor
1个回答
0
投票

经过一些调试后,我能够使用

AsyncMigration
让一切正常工作。我还发现它比使用
EventLoopFuture
阅读起来更干净。

假设我们要添加一个代表用户角色的

enum

public enum Role: String, Codable, Equatable {
    case appUser = "app_user"
    case admin = "admin"
}

您将创建一个 Fluent 模型并添加字段:

@Enum(key: "role")
var role: Role

最后,您希望分两步迁移它:

struct CreateUsers: AsyncMigration {

    func prepare(on database: Database) async throws {
        let role = try await database.enum("role")
            .case(User.Role.appUser.rawValue)
            .case(User.Role.admin.rawValue)
            .create()
        try await database.schema(User.schema)
            .id()
            // ...
            .field("role", role, .required, .custom("DEFAULT '\(User.Role.appUser.rawValue)'"))
            .create()
    }
    
    func revert(on database: Database) async throws {
        try await database.schema(User.schema).delete()
    }

}

我更喜欢使用

rawValue
,以确保一切都强绑定。

另请注意,我将

.custom("DEFAULT '\(User.Role.appUser.rawValue)'")
添加到
field
初始值设定项中。这将默认数据库的列为
app_user
(可选)。

© www.soinside.com 2019 - 2024. All rights reserved.