最近在写一个小项目,来学习Vapor。我们在写后台的时候坑定避免不了要和数据库进行交互,最起码的数据库连接呀,什么增删查改呀之类的最基本的操作还是经常需要的。Vapor 在我看来是一个特别小清新的 Swift Server 库,总之就是喜欢。来看看Vapor 怎么和MongoDB进行连接然后进行一系列的操作的。
在这里呢,MongoDB的安装呀什么乱七八糟的步骤就不多说了。
Vapor 在和数据库进行连接的时候提供了多种方案。一种呢就是 Fluent Drivers 另外一种呢就是 Providers 。使用起来呢,两种好像差不太多。不过 Providers 方式呢需要我们把对应的插件来添加进来,而 Fluent 就不需要了,直接就在Vapor 库里面有,可以直接使用。两种呢都大概介绍一下吧
Mongo ProviderAdd 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是这个样子的,其他的数据库应该也是差不多的。
其实到这里呢,我们还什么都做不了呢。只是连接了数据库。接下来,我们来创建我们的数据库模型,以便于我们对数据库的各种操作。
ModelModel 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)好了到这里你就可以愉快的进行数据库的各种增删查改的操作了。祝你好运