为什么我的 Vapor 查询总是失败?
Why does my Vapor query always fail?
我正在使用 Vapor 编写一个简单的网络应用程序。我有一个实体可以将会话信息保存到数据库中。该实体的代码如下:
struct SessionToken: Model{
var exists: Bool = false
var id: Node?
var username: String
var accessToken: String
var expiryDate: String
init(username: String, accessToken: String, expiryDate: String) {
self.username = username
self.accessToken = accessToken
self.expiryDate = expiryDate
}
init(node: Node, in context: Context) throws {
try self.id = node.extract("id")
try self.username = node.extract("username")
try self.accessToken = node.extract("accessToken")
try self.expiryDate = node.extract("expiryDate")
}
func makeNode(context: Context) throws -> Node {
let sessionToken = try Node(node:["id": id, "username": username, "accessToken": accessToken, "expiryDate": expiryDate])
return sessionToken
}
static func prepare(_ database: Database) throws {
try database.create("sessiontokens"){ sessiontokens in
sessiontokens.id()
sessiontokens.string("username")
sessiontokens.string("accessToken")
sessiontokens.string("expiryDate")
}
}
static func revert(_ database: Database) throws {
try database.delete("sessiontokens")
}
}
我在数据库中输入了一些虚假信息,但是当我使用以下代码查询数据库时:
let token = try SessionToken.query().filter("username", "user@email.com").first()
我得到一个错误:Could not initialize SessionToken, skipping: unableToConvert(node: nil, expected: "String")
有趣的是,当我用项目中的任何其他实体替换 SessionToken
时,代码工作正常。我从数据库中获取任何信息时遇到问题的唯一实体是 SessionToken
,从昨晚开始,它一直让我感到沮丧!
如果有人能指出正确的方向来解决这个问题,我将不胜感激。
P.S。我正在使用 Postgres。
我找到了问题的根源。如错误 Could not initialize SessionToken
所述,实体初始化存在问题。 Postgres 使用所有小写字母创建列名,因此如果您创建一个 "accessToken" 列,它将在没有大写 T 的 table 中保存为 "accesstoken"。如您所见,我正在查询table 和 "accessToken" 并且不存在这样的列;因此,问题的根源是 table 和查询之间的命名差异。
您可以在此处阅读有关 Postgres 区分大小写的更多信息:Are PostgreSQL column names case-sensitive?
我正在使用 Vapor 编写一个简单的网络应用程序。我有一个实体可以将会话信息保存到数据库中。该实体的代码如下:
struct SessionToken: Model{
var exists: Bool = false
var id: Node?
var username: String
var accessToken: String
var expiryDate: String
init(username: String, accessToken: String, expiryDate: String) {
self.username = username
self.accessToken = accessToken
self.expiryDate = expiryDate
}
init(node: Node, in context: Context) throws {
try self.id = node.extract("id")
try self.username = node.extract("username")
try self.accessToken = node.extract("accessToken")
try self.expiryDate = node.extract("expiryDate")
}
func makeNode(context: Context) throws -> Node {
let sessionToken = try Node(node:["id": id, "username": username, "accessToken": accessToken, "expiryDate": expiryDate])
return sessionToken
}
static func prepare(_ database: Database) throws {
try database.create("sessiontokens"){ sessiontokens in
sessiontokens.id()
sessiontokens.string("username")
sessiontokens.string("accessToken")
sessiontokens.string("expiryDate")
}
}
static func revert(_ database: Database) throws {
try database.delete("sessiontokens")
}
}
我在数据库中输入了一些虚假信息,但是当我使用以下代码查询数据库时:
let token = try SessionToken.query().filter("username", "user@email.com").first()
我得到一个错误:Could not initialize SessionToken, skipping: unableToConvert(node: nil, expected: "String")
有趣的是,当我用项目中的任何其他实体替换 SessionToken
时,代码工作正常。我从数据库中获取任何信息时遇到问题的唯一实体是 SessionToken
,从昨晚开始,它一直让我感到沮丧!
如果有人能指出正确的方向来解决这个问题,我将不胜感激。
P.S。我正在使用 Postgres。
我找到了问题的根源。如错误 Could not initialize SessionToken
所述,实体初始化存在问题。 Postgres 使用所有小写字母创建列名,因此如果您创建一个 "accessToken" 列,它将在没有大写 T 的 table 中保存为 "accesstoken"。如您所见,我正在查询table 和 "accessToken" 并且不存在这样的列;因此,问题的根源是 table 和查询之间的命名差异。
您可以在此处阅读有关 Postgres 区分大小写的更多信息:Are PostgreSQL column names case-sensitive?