最近在写一个小项目,来学习Vapor。我们在写后台的时候坑定避免不了要和数据库进行交互,最起码的数据库连接呀,什么增删查改呀之类的最基本的操作还是经常需要的。Vapor 在我看来是一个特别小清新的 Swift Server 库,总之就是喜欢。来看看Vapor 怎么和MongoDB进行连接然后进行一系列的操作的。
在这里呢,MongoDB的安装呀什么乱七八糟的步骤就不多说了。
Vapor 在和数据库进行连接的时候提供了多种方案。一种呢就是Fluent Drivers 另外一种呢就是 Providers 。使用起来呢,两种好像差不太多。不过Providers方式呢需要我们把对应的插件来添加进来,而Fluent就不需要了,直接就在Vapor 库里面有,可以直接使用。两种呢都大概介绍一下吧
Mongo Provider
Add the package to your Package.swift.
.Package(url: "https://github.com/vapor/mongo-provider.git", majorVersion: 1, minor: 1)
然后在终端中运行一下, swift package generate-xcodeproj
再次打开项目就可以使用这个插件了。
Add the provider to your Droplet.
import Vapor
import VaporMongo
let drop = Droplet()
try drop.addProvider(VaporMongo.Provider.self)
配置的话,可以直接使用代码来,也可以使用一个JSON 配置文件。在这里呢我就直接使用代码了
import Vapor
import VaporMongo
let drop = Droplet()
let mongo = try VaporMongo.Provider(database: ..., user: ..., password: ...)
drop.addProvider(mongo)
这样就可以和我们的数据库进行连接了。
Fluent Drivers
我还是比较喜欢这方式,因为不用去再引入插件了,可以直接使用了。
import Vapor
import HTTP
import FluentMongo
let mongo = try MongoDriver(database: "chat", user: "root", password: "", host: "localhost", port: 27017)
let db = Database(mongo)
let drop = Droplet()
drop.database = db
通过这种方式呢,我们需要给我们的Droplet
对象的database
属性赋值。通过这样来和我们的数据库进行连接,MongoDB是这个样子的,其他的数据库应该也是差不多的。
其实到这里呢,我们还什么都做不了呢。只是连接了数据库。接下来,我们来创建我们的数据库模型,以便于我们对数据库的各种操作。
Model
Model
is the base protocol for any of your application's models, especially those you want to persist.
我们来创建一个最基本的User
Model
final class User {
var name: String
init(name: String) {
self.name = name
}
}
然后我们在文件的顶部来引入我们需要的库
import Vapor
import Fluent
我们让我们的类来继承Model
这个协议。其实呢,这个协议又继承自很多个协议,每个协议又有自己的一些默认实现方法,使得我们的Model
功能特别的强大,你可以去看看都继承自哪些协议,每个协议又都提供了什么方法。
final class User: Model {
...
}
当你继承了Model
协议之后呢,代码会提示错误。我们需要将一些协议方法或者属性给实现了。我先给出完整的代码,每一部分是刚什么用的你可以直接去看文档Model。
import Vapor
import Fluent
final class User: Model {
var id: Node?
var name: String
init(name: String) {
self.name = name
}
init(node: Node, in context: Context) throws {
id = try node.extract("id")
name = try node.extract("name")
}
func makeNode(context: Context) throws -> Node {
return try Node(node: [
"id": id,
"name": name
])
}
static func prepare(_ database: Database) throws {
try database.create("users") { users in
users.id()
users.string("name")
}
}
static func revert(_ database: Database) throws {
try database.delete("users")
}
}
如果本身数据库模型对应的表中没有存在,需要在模型中添加以下成员变量:
var exists: Bool = false;
在这里呢,我想重要说一点的就是,不论你是通过哪一种方式来进行和数据库的连接的,当你的模型创建好之后,必须在Droplet
对象上来添加你的Model
,否则的话你进行曾删查改的操作是没有用的。
let drop = Droplet()
drop.preparations.append(User.self)
好了到这里你就可以愉快的进行数据库的各种增删查改的操作了。祝你好运
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。