【问题标题】:How do you define multiple UUID in a model如何在模型中定义多个 UUID
【发布时间】:2020-12-08 15:37:15
【问题描述】:

我正在使用 Vapor 和 Fluent。我想定义一个像下面这样的用户模型,但我收到一条错误消息:

致命错误:顶级错误:previousError(服务器:不允许表“用户”的多个主键

不能在一个模型中定义多个 UUID 吗?

import Vapor
import FluentPostgresDriver

final class User: Model, Content {
    static let schema = "users"

    @ID(custom: "id")
    var id: Int?
    
    @Field(key: "email")
    var email: String
    
    @Field(key: "password")
    var password: String
    
    @ID(custom: "public_id")
    var public_id: UUID?

    init() { }


    init(id: Int? = nil,email: String, password:String, public_id: UUID? = nil) {
        self.id = id
        self.email = email
        self.password = password
        self.public_id = public_id
    }
}

struct CreateUser: Migration {
    func prepare(on database: Database) -> EventLoopFuture<Void> {
        database.schema("users")
            .field("id", .int, .identifier(auto: true))
            .field("email", .string)
            .field("password", .string)
            .field("public_id", .uuid,?????)
            .create()
    }
.....
}

【问题讨论】:

  • @ID 表示主键。每个表只能有一个主键。所以将此字段标记为简单@Field

标签: swift vapor


【解决方案1】:

不要将公共 UUID 标记为 @ID,只需将其标记为另一个 @Field(字符串类型最简单,但如果您喜欢戴螺旋桨帽,也可以使用二进制 [16 字节]),并使其成为必需。

在创建期间,您必须实际调用 UUID 生成函数,但这应该很容易。

但是,为什么不将主键设为 UUID,而不是使用两个标识符呢?它在数据库中需要更多空间,但可能值得避免使用多个不同的 id 带来的麻烦。

【讨论】:

  • 那么@Field public_id 是如何在数据库端自动生成的呢?
  • 它不会是(ID 属性也不是——它实际上是由 Fluent 为 UUID 而不是 DB 填充的)。您可以将初始化程序更改为 public_id: UUID = UUID() 以自动获取一个
猜你喜欢
  • 1970-01-01
  • 2021-07-04
  • 1970-01-01
  • 2016-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-14
  • 1970-01-01
相关资源
最近更新 更多