代码之家  ›  专栏  ›  技术社区  ›  user2555515

Postgres jsonb Swift/Vapor中的数据

  •  0
  • user2555515  · 技术社区  · 4 年前

    下面是创建jsonb列的步骤

    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列检索和设置数据吗?

    0 回复  |  直到 4 年前
        1
  •  2
  •   Dylan Shine    4 年前

    我想你想要的是使用 .json 在迁移中声明字段时键入。

    下面是我使用starter模板代码编写的一个示例,以供参考:

    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
        }
    }
    

    我声明了两个字段, metadata person .

    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()
        }
    }