簡體   English   中英

如何在FluentProvider for Vapor中使用字符串化的UUID作為主鍵-Swift

[英]How to use a stringified UUID as Primary Key in FluentProvider for Vapor - Swift

我正在使用Vapor API,並且在使用FluentProvider時,我試圖根據App/Models/Users.swift中的Users模型創建一個Users表:

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作為此表的主鍵。

我的問題是,在編寫此模型的Preparation時,它只希望將主鍵命名為使用builder.id()創建的“ 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)
    }
}

從API調用關聯的路由時產生的錯誤:

POST /service/users/new
[SQLite.StatusError: error("table userss has no column named id")]
Conform 'SQLite.StatusError' to Debugging.Debuggable to provide more 
debug information.

如果我理解正確,它將僅接受一個名為“ id”的ID列,該列顯然只能通過使用builder.id()方法生成,該方法僅向ID分配一個自動遞增的整數。

所以我的問題是:

  1. 是否可以將特定的列用作“主鍵/標識符”列,如果可以,如何使用?

  2. 是否將"UserUUID"重命名為"id"但保持其余屬性不變也可以作為解決方案?

看起來Fluent知道如何通過在Entity上使用靜態變量來創建ID,這是User模型所遵循的協議。 具體來說,您似乎需要覆蓋以下兩個變量:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM