在做Ray Wenderlich教程“服务器端Swift with Vapor:Persisting Models”时,我尝试在Acronyms类中添加一个参数(param)。
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()
答案 0 :(得分:4)
我假设你没有恢复数据库。您更改了模型的属性,因此只需在终端vapor run prepare --revert
中写入。这将恢复您的数据库,蒸汽将能够创建新参数。
答案 1 :(得分:2)
完成此操作的另一个案例
TimSort
并且错误仍然存在。 您应该检查在模型中的prepare方法中创建的表名。
vapor run prepare --revert
entity 是表的名称,就Vapor / Fluent而言。默认情况下,它是模型的名称,末尾带有-s。
例如:如果您创建汽车模型,则应将表格命名为“汽车”。所以Car + s
static func prepare(_ database: Database) throws {
try database.create(entity) { users in
...
}
}
另一个例子:你有模型Carwash成为语法不正确的洗车。所以你应该命名洗牌或使用这样的实体。
static var entity = "cars"
答案 2 :(得分: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。希望这会对某人有所帮助。