Vapor:将字节数组保存到 SQLite 数据库?

Vapor: Saving Byte array to SQLite database?

我无法将大型 (~20k) JSON blob 保存到 SQLite 数据库中。我用 builder.bytes("data") 创建了行,它在数据库文件中变成了 blob 行。当我尝试保存一个字节数组时,我得到这个错误:

S Q Lite Driver Error: Unsupported Command: Array values not supported.] [Identifier: Fluent.SQLiteDriverError.unsupported] [Possible Causes: using operations not supported by sqlite] [Suggested Fixes: verify data is not corrupt if data type should be supported by sqlite]

错误消息来自实现的 switch 语句 here

StructuredData 枚举中定义了一个单独的 bytes 案例,SQLDriver 似乎支持它,但我不知道如何到达那里。

我的 class 是这样定义的:

最终class Blob:模型{ 让存储 = 存储 ()

let uuid: String
let revision: Int
let userId: Identifier
let data: Bytes


init(uuid inUuid: String, revision inRevision: Int, data inData: [UInt8], user: User) throws {
    uuid = inUuid
    userId = try user.assertExists()
    revision = inRevision
    data = inData
}

init(row: Row) throws {
    uuid = try row.get("uuid")
    userId = try row.get(User.foreignIdKey)
    revision = try row.get("revision")
    data = try row.get("data")
}

func makeRow() throws -> Row {
    var row = Row()
    try row.set("uuid", uuid)
    try row.set(User.foreignIdKey, userId)
    try row.set("revision", revision)
    try row.set("data", data)
    return row
}

}

这是使用 Vapor Toolbox 2.0.3 和 Vapor Framework 2.1.3。

在当前版本的 Vapor 2 中,在转换字节数组 from/to 节点和其他 StructuredDataWrappers 时不能依赖 Fuzzy get/set 方法。

相反,您必须明确两个方向:

init(row: Row) throws {
    // ...
    data = row["data"]?.bytes ?? []
}

func makeRow() throws -> Row {
    var row = Row()
    // ...
    try row.set("data", StructuredData.bytes(data))
    return row
}

Here 是 GitHub 上的相关问题。