swift Vapor - 操作无法完成。 (MySQL.Error错误4.)

问题描述:

我不断收到此错误。swift Vapor - 操作无法完成。 (MySQL.Error错误4.)

我确认mysql服务器正在我的MAC机器上运行,并且我在这个项目的mysql服务器上创建了一个数据库。

  1. 下面是我main.swift
import Vapor 
import VaporMySQL 

let drop = Droplet() 

try drop.addProvider(VaporMySQL.Provider.self) 

drop.preparations = [Student.self] 

let _ = HomeController(drop: drop) 

drop.run() 
  1. 下面是我HomeController.swift
开始=>
import Vapor 
import HTTP 
import Foundation 

final class HomeController { 

    var drop: Droplet 

    init(drop: Droplet) { 
     self.drop = drop 

    let studentsGroup = self.drop.grouped("/") 
    studentsGroup.get(handler: homePageWithBankList) 
    } 

    func homePageWithBankList(request: Request) throws -> ResponseRepresentable { 

    do { 
     var student = Student() 
     student.name = "name" 
     try student.save()   // Here error raise 
    } catch { 
     print(error.localizedDescription) // Getting error log here 
    } 

    return "" 

    } 
} 
  1. 下面是我Student.swift模型类
开始=>
import Vapor 

final class Student: Model { 

    var id: Node? 
    var exists: Bool = false 

    var name: String = "" 

    init() { 
     self.id = nil 
    } 

    init(node: Node, in context: Context) throws { 
     id = try node.extract("id") 
     name = try node.extract("name") 
    } 

    public func makeNode(context: Context) throws -> Node { 
     return try Node(node:[ 
      "id": id, 
      "name": name 
      ]) 
    } 

    static func prepare(_ database: Database) throws { 
     try database.create("student") { student in 
      student.id() 
      student.string("name") 
     } 
    } 

    static func revert(_ database: Database) throws { 
     try database.delete("student") 
    } 

} 
  1. 下面是mysql.json配置文件
开始=>
{ 
    "host": "localhost", 
    "user": "root", 
    "password": "admin", 
    "database": "studentsDB", 
    "port": "3306", 
    "encoding": "utf8" 
} 
  1. 下面是我的包依赖性
开始=>
dependencies: [ 
     .Package(url: "https://github.com/vapor/vapor.git", majorVersion: 1, minor: 5), 
     .Package(url: "https://github.com/vapor/mysql-provider.git", majorVersion: 1, minor: 1) 
    ] 
  1. 下面是在我的MAC
  2. 运行MySQL --version
开始=>
mysql Ver 14.14 Distrib 5.7.17, for osx10.12 (x86_64) using EditLine wrapper 

编辑: - 我有在GitHub上>>Here<<这个项目

所以这是一个初学者的错误:)

首先,更改

do { 
     var student = Student() 
     student.name = "name" 
     try student.save()   // Here error raise 
    } catch { 
     print(error.localizedDescription) // Getting error log here 
    } 

var student = Student() 
student.name = "name" 
do { 
    try student.save() 
} catch { 
    print(error) 
} 

,看看有什么地方出了错

所以,你尝试使用学生 - 表,但创建学生在您的准备。

变化

try database.create("student") { student in } ... 

try database.create("students") { student in } ... 

否则,您可以用

final class Student: Model { 
    static var entity = "student"  
    ... 
} 

总是好的指定模型的声明中的表名来看看文档

Vapor Documentation

+0

我已经做了所有的改变,但仍然没有运气。我也更新了GitHub上的代码。 –

+0

你能告诉我们为什么从'学生'改为'学生'的名字会起作用吗?,因为我尝试了'学生',它的工作原理,但尝试了更多的表名更改后,它随机与一些表名称工作,但随机不工作与其他表名。这会让我发疯,为什么会发生这种情况。 :(。plz help –

+0

最后使用'静态var实体'一切正常,如果你能解释为什么这样工作,这可能是一个好的提示,因为在蒸气中我认为它们大多数来自iOS,所以我们不知道这种提示。非常感谢。 –