[英]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分配一個自動遞增的整數。
所以我的問題是:
是否可以將特定的列用作“主鍵/標識符”列,如果可以,如何使用?
是否將"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.