最近在写一个小项目,来学习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)

好了到这里你就可以愉快的进行数据库的各种增删查改的操作了。祝你好运


dowhilenet
654 声望10 粉丝