如何在Vapor-Swift的FluentProvider中使用字符串化UUID作为主键

如何在Vapor-Swift的FluentProvider中使用字符串化UUID作为主键,swift,sqlite,fluent,vapor,Swift,Sqlite,Fluent,Vapor,我正在开发Vapor API,在使用FluentProvider时,我试图基于应用程序/模型/用户中的用户模型创建一个用户表。swift: final class Users: Model { let storage = Storage() // Properties let UserUUID: String let FirstName: String let LastName: String let EMail: String

我正在开发Vapor API,在使用FluentProvider时,我试图基于
应用程序/模型/用户中的
用户
模型创建一个
用户
表。swift

final class Users: Model {
    let storage = Storage()

    // Properties
    let UserUUID:  String
    let FirstName: String
    let LastName:  String
    let EMail:     String
    let Password:  String

    // Initializer
    init( userUUID:  String,
          firstName: String, lastName: String, 
          email:     String, password: String ) 
    {
        self.UserUUID  = userUUID
        self.FirstName = firstName
        self.LastName  = lastName
        self.EMail     = email
        self.Password  = password
    }

    init(row: Row) throws {
        UserUUID  = try row.get("UserUUID" )
        FirstName = try row.get("FirstName")
        LastName  = try row.get("LastName" )
        EMail     = try row.get("EMail"    )
        Password  = try row.get("Password" )
    }

    func makeRow() throws -> Row {
        var row = Row()

        try row.set("UserUUID",  UserUUID )
        try row.set("FirstName", FirstName)
        try row.set("LastName",  LastName )
        try row.set("EMail",     EMail    )
        try row.set("Password",  Password )

        return row
    }
}
默认情况下,这与SQLite提供程序关联。我想使用字符串格式的UUID作为该表的主键

我的问题是,在编写此模型的准备工作时,它只希望主键名为“id”,它是使用
builder.id()
创建的。如果我尝试创建一个自定义列,并将其用作主键/标识符,则会抛出一个错误。编制代码如下:

extension Users: Preparation {
    static func prepare(_ database: Database) throws {
        try database.create(self) { builder in

            /* builder.id()    <- intentionally omitted. */
            builder.custom( // <- Attempted in place of builder.id()
                "UserUUID",  
                 type:"VARCHAR(255) PRIMARY KEY", 
                 optional: false, 
                 unique: true
            ) 
            builder.string("FirstName", optional: false, unique: false)
            builder.string("LastName",  optional: false, unique: false)
            builder.string("EMail",     optional: false, unique: true)
            builder.string("Password",  optional: false, unique: false)
        }
    }

    static func revert(_ database: Database) throws {
        try database.delete(self)
    }
}
如果我理解正确,它将只接受名为“ID”的ID列,这显然只能通过使用
builder.ID()
方法生成,该方法只为ID分配一个自动递增的整数

因此,我的问题是:

  • 是否可以使用特定列作为主键/标识符 列,如果是,如何

  • “UserUUID”
    重命名为
    “id”
    ,但保留其余的 同样的属性也可以作为解决方案吗


  • 看起来Fluent知道如何使用
    实体
    上的静态变量创建ID,这是您的
    用户
    模型所遵循的协议。具体来说,您需要覆盖以下两个变量:

    final class Users: Model {
        static var idKey: String {
            return "UserUUID"
        }
        static var idType: IdentifierType {
            return .uuid
        }
    }
    

    现在,如果您取消注释
    builder.id()
    行,则应该正确创建id。

    我在Vapor项目中使用UUID,没有问题,并且不必在准备过程中编写自定义代码

    您是否尝试过在fluent.json中设置idType

    “idType”:“uuid”

    请注意,我指的是蒸汽2.4

    final class Users: Model {
        static var idKey: String {
            return "UserUUID"
        }
        static var idType: IdentifierType {
            return .uuid
        }
    }