Vapor/Fluent:架构中的 uuid 数组时,子对象未保存
Vapor/Fluent: Child object not saving when array of uuids in schema
我有一个 table 包含一个 Coin 实体,以及相应的 Fluent 模型。它拒绝保存,直到我删除了一个字段,该字段旨在包含一组 uuid。这被称为 sources
,它的功能是为衍生新硬币的其他硬币提供向后追踪 - 例如,如果用户有两个硬币(可以具有任意数量值),则目标是能够将它们合并成一个单一的硬币,具有合并硬币的组合价值。
架构(注释字段看起来像这样(它包括迁移,相应字段也被注释掉):
final class Coin : Model, Content, ResponseEncodable {
init() {}
init(player: User, quantity: Int, type: CreatedFor, sources : [Coin] = []) {
self.id = id
self.$player.id = player.id!
self.quantity = quantity
self.type = type
// self.sources = sources
}
static let schema: String = "coins"
@ID(key: .id) var id: UUID?
@Timestamp(key: "created_at", on: .create) var createdAt: Date?
@Timestamp(key: "updated_at", on: .update) var updatedAt: Date?
@Parent(key: "player") var player: User
@Field(key: "quantity") var quantity: Int
@Field(key: "type") var type: CreatedFor
// @Field(key: "sources") var sources: [Coin]
enum CreatedFor: String, Codable {
case transfer
case ante
case purchase
case winnings
case gift
case merge
}
}
extension Coin {
struct BuildCoin: Fluent.Migration {
var name : String { "BuildCoin" }
func prepare(on database: Database) -> EventLoopFuture<Void> {
database.schema("coins")
.id()
.field("created_at", .datetime)
.field("updated_at", .datetime)
.field("player", .uuid, .required)
.field("quantity", .int, .required, .custom("DEFAULT 0"))
.field("type", .string, .required, .custom("DEFAULT 'gift'"))
// .field("sources", .array(of: .uuid))
.create()
}
func revert(on database: Database) -> EventLoopFuture<Void> {
database.schema("coins").delete()
}
}
}
一旦我将它归结为出现问题的地方,我就能够得到这个错误,它似乎来自 postgres:
{"error":true,"reason":"server: column \"sources\" is of type uuid[] but expression is of type jsonb[] (transformAssignedExpr)"}
我想包括这个字段(但我现在可以不用它继续)。这里发生了什么?在调用 init() 时,它只是作为一个空数组被调用,所以我认为这不会造成任何问题...
提前致谢...
如果您想保存为 uuid 数组而不是
@Field(key: "sources") var sources: [Coin]
你应该使用
@Field(key: "sources") var sources: [UUID]
其他你试图将硬币数组保存到数据库,并且这个数组将被序列化为 jsonb - 因为它是对象而不是 UUID。查看您的代码,我认为您应该使用一对多或多对多关系。
我有一个 table 包含一个 Coin 实体,以及相应的 Fluent 模型。它拒绝保存,直到我删除了一个字段,该字段旨在包含一组 uuid。这被称为 sources
,它的功能是为衍生新硬币的其他硬币提供向后追踪 - 例如,如果用户有两个硬币(可以具有任意数量值),则目标是能够将它们合并成一个单一的硬币,具有合并硬币的组合价值。
架构(注释字段看起来像这样(它包括迁移,相应字段也被注释掉):
final class Coin : Model, Content, ResponseEncodable {
init() {}
init(player: User, quantity: Int, type: CreatedFor, sources : [Coin] = []) {
self.id = id
self.$player.id = player.id!
self.quantity = quantity
self.type = type
// self.sources = sources
}
static let schema: String = "coins"
@ID(key: .id) var id: UUID?
@Timestamp(key: "created_at", on: .create) var createdAt: Date?
@Timestamp(key: "updated_at", on: .update) var updatedAt: Date?
@Parent(key: "player") var player: User
@Field(key: "quantity") var quantity: Int
@Field(key: "type") var type: CreatedFor
// @Field(key: "sources") var sources: [Coin]
enum CreatedFor: String, Codable {
case transfer
case ante
case purchase
case winnings
case gift
case merge
}
}
extension Coin {
struct BuildCoin: Fluent.Migration {
var name : String { "BuildCoin" }
func prepare(on database: Database) -> EventLoopFuture<Void> {
database.schema("coins")
.id()
.field("created_at", .datetime)
.field("updated_at", .datetime)
.field("player", .uuid, .required)
.field("quantity", .int, .required, .custom("DEFAULT 0"))
.field("type", .string, .required, .custom("DEFAULT 'gift'"))
// .field("sources", .array(of: .uuid))
.create()
}
func revert(on database: Database) -> EventLoopFuture<Void> {
database.schema("coins").delete()
}
}
}
一旦我将它归结为出现问题的地方,我就能够得到这个错误,它似乎来自 postgres:
{"error":true,"reason":"server: column \"sources\" is of type uuid[] but expression is of type jsonb[] (transformAssignedExpr)"}
我想包括这个字段(但我现在可以不用它继续)。这里发生了什么?在调用 init() 时,它只是作为一个空数组被调用,所以我认为这不会造成任何问题...
提前致谢...
如果您想保存为 uuid 数组而不是
@Field(key: "sources") var sources: [Coin]
你应该使用
@Field(key: "sources") var sources: [UUID]
其他你试图将硬币数组保存到数据库,并且这个数组将被序列化为 jsonb - 因为它是对象而不是 UUID。查看您的代码,我认为您应该使用一对多或多对多关系。