2017-04-26 79 views
2

我正在使用Vapor编写简单的网络应用程序。我有一个实体将会话信息保存到数据库中。这个实体的代码如下:为什么我的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", "[email protected]").first() 

我得到一个错误:Could not initialize SessionToken, skipping: unableToConvert(node: nil, expected: "String")

有趣的是,当我用工程中的任何其他实体替换SessionToken时,代码工作得很好。我从数据库中获取任何信息的唯一实体是SessionToken,自从昨晚以来,我一直感到沮丧!

我真的很感激,如果有人能指出我在正确的方向来解决这个问题。

P.S.我正在使用Postgres。

回答

3

我发现问题的根源。正如错误Could not initialize SessionToken所述,实体的初始化存在问题。 Postgres使用全部小写字母创建列名,所以如果你创建一个“accessToken”列,它将被保存为表中的“accesstoken”,而不需要大写字母T.正如你所看到的,我使用“accessToken”来查询表,并且没有列存在;因此,问题的根源在于命名表与查询之间的差异。

您可以在这里阅读更多关于Postgres区分大小写的信息:Are PostgreSQL column names case-sensitive?