Swift/Vapor 中的 Postgres jsonb 数据

Postgres jsonb data in Swift/Vapor

我有以下创建 jsonb 列的 Vapor Fluent 迁移

public func prepare(on database: Database) -> EventLoopFuture<Void> {
        return database.schema(MyModel.schema)
            .id()
            .field(.name, .custom("VARCHAR(255)"), .required)
            .field(.metadata, .custom("JSONB"), .required)
            .create()
    }

模型看起来像这样:

public final class MyModel: Model, Content {
    public static let schema = "blah"
    
    @ID(key: .id)
    public var id: UUID?
    
    @Field(key: .metadata)
    public var metadata: Data // This is obviously wrong.
}

知道如何让 Vapor 从 Postgres jsonb 列检索和设置数据吗?

我认为您正在寻找的是在迁移中声明字段时使用 .json 类型。

这是我使用入门模板代码整理的示例以供参考:

struct Person: Codable {
    let name: String
}

final class Todo: Model, Content {
    static let schema = "todos"
    
    @ID(key: .id)
    var id: UUID?
    
    @Field(key: "metadata")
    var metadata: [String: String]
    
    @Field(key: "person")
    var person: Person

    init() { }

    init(id: UUID? = nil, metadata: [String: String], person: Person) {
        self.id = id
        self.metadata = metadata
        self.person = person
    }
}

我声明了两个字段,metadataperson

struct CreateTodo: Migration {
    func prepare(on database: Database) -> EventLoopFuture<Void> {
        return database.schema("todos")
            .id()
            .field("metadata", .json, .required)
            .field("person", .json, .required)
            .create()
    }


    func revert(on database: Database) -> EventLoopFuture<Void> {
        return database.schema("todos").delete()
    }
}