Fluent 模型持久化
Fluent 是 Vapor 3 里的 ORM(对象关系映射)。本文带你定义第一个数据模型 Acronym,并让它通过 Migration 自动建表、持久化到数据库。
数据库与 Fluent
Fluent 是 Vapor 中和数据库交互的工具,即是 ORM(Object Relational Mapping,对象关系映射)。它是在 Vapor 和数据库之间的一个抽象层,它的存在让我们操作数据库变得更加容易,我们不需要直接对数据库进行操作。
Models 是 Swift 中表示数据的术语,并且这个概念在 Fluent 中也是一致的。Models 就是要存入数据库中的对象。
所有的 Fluent 数据模型都要遵守 Codable 协议,把类加上 final 可以获得性能提升,id 会在存入数据库时填充。Vapor 提供了协议 Content,它是对 Codable 的封装,可以方便在多种数据格式之间进行转换。
自定义 Model 在数据库中 ID 的名称和类型,需要数据模型遵循 Model 协议。一般 Fluent 针对每种数据库已经定义了各种可以遵循的 Model 协议,如 SQLiteModel 和 SQLiteUUIDModel 以及 SQLiteStringModel。
要想把数据存入数据库,必须在数据库中建立相应的表,这种建表操作 Fluent 通过 migration 来进行。Migration 只会执行一次,不会创建已经存在的表。
我们之后要创建一个缩略语相关的应用,这里可以先把数据模型建立起来:
$ touch Sources/App/Models/Acronym.swift
定义数据模型
import Vapor
import FluentSQLite
final class Acronym: Codable {
var id: Int?
var short: String
var long: String
init(short: String, long: String) {
self.short = short
self.long = long
}
}
extension Acronym: Model {
typealias Database = SQLiteDatabase
typealias ID = Int
public static var idKey: IDKey = \Acronym.id
}
extension Acronym: SQLiteModel {}
extension Acronym: Migration {}
extension Acronym: Content {}
首先定义遵循 Codable 协议的数据类型 Acronym,它有两个字符串类型的属性,另一个属性 id 是留给数据库使用的,数据库在存储数据时,会赋值给每一个数据实例一个唯一标识。
然后我们又让数据模型遵循 Model 协议,其目的是为了告诉 Fluent 我们要使用哪种数据库来存储数据、数据实例唯一标识符的类型,以及在数据模型中哪一个属性用来表示这个数据实例的唯一标识。每一种数据库其实已经提供了对应的协议类型,以简化操作,我们可以把这部分直接替换成:
extension Acronym: SQLiteModel {}
通过 Migration 建表
要把数据存入数据库,那么必须让数据库对应地建立一张存放这类数据的数据表,这个建表的任务我们可以让 Migration 来处理。但这要求我们的数据模型遵循协议 Migration。对于简单的数据模型,我们只需要遵循这个协议就可以了,复杂的时候可能需要我们自己实现一个 Migration。
要让应用在启动时创建数据表,我们需要在 configure.swift 文件中进行配置:
migrations.add(model: Acronym.self, database: .sqlite)