【问题标题】:500 The operation couldn’t be completed. (PostgreSQL.DatabaseError error 1.)500 操作无法完成。 (PostgreSQL.DatabaseError 错误 1。)
【发布时间】:2017-06-04 07:27:56
【问题描述】:

在做 Ray Wenderlich 教程“Server Side 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()

【问题讨论】:

    标签: sql swift database postgresql vapor


    【解决方案1】:

    我假设您没有还原数据库。您更改了模型的属性,因此只需在终端中写入 vapor run prepare --revert 即可。这将恢复您的数据库,并且 vapor 将能够创建新参数。

    【讨论】:

      【解决方案2】:

      你这样做的另一种情况

      vapor run prepare --revert
      

      并且错误仍然存​​在。 您应该检查您在模型中的 prepare 方法中创建的表名。

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

      entity 是表的名称,就 Vapor/Fluent 而言。默认情况下,它是模型的名称,以 -s 结尾。

      例如:如果您创建 Car 模型,您应该将表命名为“cars”。所以汽车+s

       static var entity = "cars"
      

      另一个示例:您的模型 Carwash 变成了语法错误的 carwash。所以你应该命名为洗车场或使用这样的实体。

       static var entity = "carwashes"
      

      【讨论】:

        【解决方案3】:

        我在准备方法中遇到了完全相同的错误:

        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。希望这会对某人有所帮助。

        【讨论】:

          猜你喜欢
          • 2015-06-03
          • 2018-04-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-29
          • 2017-05-07
          • 2021-03-24
          • 2020-07-29
          相关资源
          最近更新 更多