2017-01-19 23 views
2

在做Ray Wenderlich教程「服務器端Swift with Vapor:持久模型」時,我試圖給類縮寫添加一個參數(參數)。500操作無法完成。 (PostgreSQL.DatabaseError錯誤1.)

import Vapor 

final class Acronym: Model { 

    var id: Node? 
    var exists: Bool = false 

    var short: String 
    var long: String 
    var param: String 

    init(short: String, long: String, param: String) { 
    self.id = nil 
    self.short = short 
    self.long = long 
    self.param = param 
    } 

    init(node: Node, in context: Context) throws { 
    id = try node.extract("id") 
    short = try node.extract("short") 
    long = try node.extract("long") 
    param = try node.extract("param") 
    } 

    func makeNode(context: Context) throws -> Node { 
    return try Node(node: [ 
     "id": id, 
     "short": short, 
     "long": long, 
     "param": param 
    ]) 
    } 

    static func prepare(_ database: Database) throws { 
    try database.create("acronyms") { users in 
     users.id() 
     users.string("short") 
     users.string("long") 
     users.string("param") 
    } 
    } 

    static func revert(_ database: Database) throws { 
    try database.delete("acronyms") 
    } 

} 

起初我運行這個代碼沒有一個更多的參數。它的工作原理。但是當我添加一個失敗。

錯誤:500操作無法完成。 (PostgreSQL.DatabaseError錯誤1)

我main.swift:

import Vapor 
import VaporPostgreSQL 

let drop = Droplet(
    preparations: [Acronym.self], 
    providers: [VaporPostgreSQL.Provider.self] 
) 

drop.get("hello") { request in 
    return "Hello, world!" 
} 

drop.get("version") { req in 
    if let db = drop.database?.driver as? PostgreSQLDriver { 
     let version = try db.raw("SELECT version()") 
     return try JSON(node: version) 
    } else { 
     return "No db connection" 
    } 
} 

drop.get("test") { request in 
    var acronym = Acronym(short: "AFK", long: "Away From Keyboard", param: "One More Parametr") 
    try acronym.save() 
    return try JSON(node: Acronym.all().makeNode()) 
} 

drop.run() 

回答

4

我假設你沒有恢復數據庫。您更改了模型的屬性,只需在終端vapor run prepare --revert中寫入即可。這將恢復你的數據庫和蒸氣將能夠創造新的參數。

2

,當你做到了這一點

vapor run prepare --revert 

和錯誤仍然存​​在另一種情況。 您應該檢查您在模型中的準備方法中創建的表名稱。

static func prepare(_ database: Database) throws { 
    try database.create(entity) { users in 
     ... 
    } 
} 

實體是表的名稱,至於蒸氣/流利認爲。默認情況下,它是模型的名稱,最後加上-s。

例如:如果您創建汽車模型,您應該命名您的表「汽車」。 So Car + s

static var entity = "cars" 

另外一個例子:你有模型Carwash成爲語法錯誤的洗車。所以你應該叫洗車或使用這樣的實體。

static var entity = "carwashes" 
1

我碰上了完全相同的錯誤,在我的準備方法:

public static func prepare(_ database: Database) throws { 
    try database.create(self.entity) { tasks in 
     tasks.id() 
     tasks.string(Identifiers.title) 
    } 
} 

我用self指我的數據庫,像這樣:

public static func prepare(_ database: Database) throws { 
    try self.database.create(self.entity) { tasks in 
     tasks.id() 
     tasks.string(Identifiers.title) 
    } 
} 

顯然,你必須訪問作爲參數傳入的Database實例,而不是static Database variable。希望這會幫助某人。

相關問題