2017-01-19 2 views
2

Выполняя урок Ray Wenderlich «Side Side Side с паром: устойчивые модели» Я попытался добавить еще один параметр (param) в класс Акронимы.500 Операция не может быть завершена. (PostgreSQL.DatabaseError error 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 
     ... 
    } 
} 

объект это имя таблицы, насколько думает Vapor/свободный. По умолчанию это имя модели, с -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. Надеюсь, это поможет кому-то.

Смежные вопросы