500 Операция не может быть завершена. (Ошибка PostgreSQL.DatabaseError 1.)

При выполнении учебника Рэя Вендерлиха «Server Side Swift с Vapor: постоянные модели» я попытался добавить еще один параметр (param) в класс Acronyms.

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()

person Said-Abdulla Atkaev    schedule 19.01.2017    source источник


Ответы (3)


Я предполагаю, что вы не вернули базу данных. Вы изменили свойства модели, поэтому просто напишите в терминале vapor run prepare --revert. Это вернет вашу базу данных, и пара сможет создать новый параметр.

person Boris Gurtovoy    schedule 19.01.2017

Другой случай, когда ты это сделал

vapor run prepare --revert

и ошибка все еще существует. Вы должны проверить имя таблицы, которую вы создаете в своем методе подготовки в своей модели.

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

entity - это имя таблицы, по мнению Vapor / Fluent. По умолчанию это имя модели с -s на конце.

Например: если вы создаете модель автомобиля, вы должны назвать свою таблицу «автомобили». Итак, автомобиль + s

 static var entity = "cars"

Другой пример: у вас есть модель Carwash, которая становится грамматически неверной автомойкой. Поэтому вам следует называть это автомойки или использовать подобный объект.

 static var entity = "carwashes"
person Said-Abdulla Atkaev    schedule 28.01.2017

Я сталкиваюсь с той же ошибкой в ​​моем методе подготовки:

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, переданному как параметр, а не к статическая Database переменная. Надеюсь, это кому-то поможет.

person pprochazka72    schedule 08.02.2017