最近在写一个小项目,来学习Vapor。我们在写后台的时候坑定避免不了要和数据库进行交互,最起码的数据库连接呀,什么增删查改呀之类的最基本的操作还是经常需要的。Vapor 在我看来是一个特别小清新的 Swift Server 库,总之就是喜欢。来看看Vapor 怎么和MongoDB进行连接然后进行一系列的操作的。
在这里呢,MongoDB的安装呀什么乱七八糟的步骤就不多说了。
Vapor 在和数据库进行连接的时候提供了多种方案。一种呢就是Fluent Drivers 另外一种呢就是 Providers 。使用起来呢,两种好像差不太多。不过Providers方式呢需要我们把对应的插件来添加进来,而Fluent就不需要了,直接就在Vapor 库里面有,可以直接使用。两种呢都大概介绍一下吧
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 Vaporimport VaporMongolet drop = Droplet()try drop.addProvider(VaporMongo.Provider.self)
配置的话,可以直接使用代码来,也可以使用一个JSON 配置文件。在这里呢我就直接使用代码了
import Vaporimport VaporMongolet drop = Droplet()let mongo = try VaporMongo.Provider(database: ..., user: ..., password: ...)drop.addProvider(mongo)
这样就可以和我们的数据库进行连接了。
Fluent Drivers
我还是比较喜欢这方式,因为不用去再引入插件了,可以直接使用了。
import Vaporimport HTTPimport FluentMongolet 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 Vaporimport Fluent
我们让我们的类来继承Model
这个协议。其实呢,这个协议又继承自很多个协议,每个协议又有自己的一些默认实现方法,使得我们的Model
功能特别的强大,你可以去看看都继承自哪些协议,每个协议又都提供了什么方法。
final class User: Model { ...}
当你继承了Model
协议之后呢,代码会提示错误。我们需要将一些协议方法或者属性给实现了。我先给出完整的代码,每一部分是刚什么用的你可以直接去看文档。
import Vaporimport Fluentfinal 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)
好了到这里你就可以愉快的进行数据库的各种增删查改的操作了。祝你好运