500 操作无法完成。 (PostgreSQL.DatabaseError 错误 1。)
500 The operation couldn’t be completed. (PostgreSQL.DatabaseError error 1.)
在做 Ray Wenderlich 教程时 "Server Side Swift with Vapor: Persisting Models" 我试图向 class 首字母缩略词添加一个参数 (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()
我假设您没有还原数据库。您更改了模型的属性,因此只需在终端 vapor run prepare --revert
中写入即可。这将恢复您的数据库并且 vapor 将能够创建新参数。
你这样做的另一个案例
vapor run prepare --revert
错误仍然存在。
您应该检查 table 您在模型的准备方法中创建的名称。
static func prepare(_ database: Database) throws {
try database.create(entity) { users in
...
}
}
entity 是 table 的名称,就 Vapor/Fluent 而言。默认情况下,它是模型的名称,末尾带有 -s。
例如:如果您创建汽车模型,则应将您的模型命名为 table "cars"。所以车+s
static var entity = "cars"
另一个示例:您的模型 Carwash 变成了语法错误的洗车。所以你应该命名为洗车场或使用这样的实体。
static var entity = "carwashes"
我 运行 在我的准备方法中遇到了完全相同的错误:
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。希望这会对某人有所帮助。
在做 Ray Wenderlich 教程时 "Server Side Swift with Vapor: Persisting Models" 我试图向 class 首字母缩略词添加一个参数 (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()
我假设您没有还原数据库。您更改了模型的属性,因此只需在终端 vapor run prepare --revert
中写入即可。这将恢复您的数据库并且 vapor 将能够创建新参数。
你这样做的另一个案例
vapor run prepare --revert
错误仍然存在。 您应该检查 table 您在模型的准备方法中创建的名称。
static func prepare(_ database: Database) throws {
try database.create(entity) { users in
...
}
}
entity 是 table 的名称,就 Vapor/Fluent 而言。默认情况下,它是模型的名称,末尾带有 -s。
例如:如果您创建汽车模型,则应将您的模型命名为 table "cars"。所以车+s
static var entity = "cars"
另一个示例:您的模型 Carwash 变成了语法错误的洗车。所以你应该命名为洗车场或使用这样的实体。
static var entity = "carwashes"
我 运行 在我的准备方法中遇到了完全相同的错误:
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。希望这会对某人有所帮助。