swift Vapor - 操作无法完成。 (MySQL.Error错误4.)
问题描述:
我不断收到此错误。swift Vapor - 操作无法完成。 (MySQL.Error错误4.)
我确认mysql服务器正在我的MAC机器上运行,并且我在这个项目的mysql服务器上创建了一个数据库。
- 下面是我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()
开始=>
- 下面是我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 ""
}
}
开始=>
- 下面是我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")
}
}
开始=>
- 下面是mysql.json配置文件
{
"host": "localhost",
"user": "root",
"password": "admin",
"database": "studentsDB",
"port": "3306",
"encoding": "utf8"
}
开始=>
- 下面是我的包依赖性
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)
]
开始=>
- 下面是在我的MAC
运行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"
...
}
总是好的指定模型的声明中的表名来看看文档
我已经做了所有的改变,但仍然没有运气。我也更新了GitHub上的代码。 –
你能告诉我们为什么从'学生'改为'学生'的名字会起作用吗?,因为我尝试了'学生',它的工作原理,但尝试了更多的表名更改后,它随机与一些表名称工作,但随机不工作与其他表名。这会让我发疯,为什么会发生这种情况。 :(。plz help –
最后使用'静态var实体'一切正常,如果你能解释为什么这样工作,这可能是一个好的提示,因为在蒸气中我认为它们大多数来自iOS,所以我们不知道这种提示。非常感谢。 –