如何使用
enum
迁移 AsyncMigration
?网上有一些使用 EventLoopFuture
进行迁移的示例,但我更喜欢使用 Swift Concurrency。
经过一些调试后,我能够使用
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
(可选)。