gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 00:56:01 29 4
gpt4 key购买 nike

我正在使用 Vapor API,在使用 FluentProvider 时,我正在尝试根据 App/Models 中的 Users 模型创建一个 Users 表/用户.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 作为该表的主键。

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

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,Entity 是您的 User 模型符合的协议(protocol)。具体来说,您似乎需要覆盖以下两个变量:

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

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

关于swift - 如何在 FluentProvider for Vapor - Swift 中使用字符串化的 UUID 作为主键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48214530/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com