2017-04-26 77 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?