Fluent提供了一种简单、简单、安全的API,用于处理持久数据。每个数据库表/集合都由一个可用于与数据交互的Model
表示。Fluent支持常见的操作,如创建、读取、更新和删除模型。它还支持更高级的操作,比如连接、关联和软删除。
笔记
不要忘记将import FluentProvider
(或您的其他数据库提供程序)添加到您的Swift文件的顶部。
默认情况下,Fluent自带SQLite。您可以通过SQLite快速地使用它提供的内存数据库来搭建应用程序。默认情况下,这是默认启用的。要了解更多关于配置数据库的信息,请查看可用的驱动程序(在本篇最后)。
创建一个模型(Creating a Model)
模型是数据库中Swift数据的展示。因此,它们对于大多数Fluent的api来说都是至关重要的。
让我们来看看一个简单的模型是什么样子的。
final class Pet: Model {
var name: String
var age: Int
let storage = Storage()
init(row: Row) throws {
name = try row.get("name")
age = try row.get("age")
}
init(name: String, age: Int) {
self.name = name
self.age = age
}
func makeRow() throws -> Row {
var row = Row()
try row.set("name", name)
try row.set("age", age)
return row
}
}
在这里,我们创建了一个简单的类宠物(Pet
),名字和年龄。我们将添加一个简单的init方法来创建新的宠物对象。
储存(Storage)
storage
属性允许Fluent在模型中存储额外的信息——比如模型的数据库id。
行(Row)
Row
结构体表示一个数据库行。您的模型应该能够对数据库行进行解析和序列化。
解析(Parse)
下面是从数据库中解析Pet的代码。
final class Pet: Model {
...
init(row: Row) throws {
name = try row.get("name")
age = try row.get("age")
}
}
序列化(Serialize)
下面是将Pet序列化到数据库的代码。
final class Pet: Model {
...
func makeRow() throws -> Row {
var row = Row()
try row.set("name", name)
try row.set("age", age)
return row
}
}
准备数据库(Preparing the Database)
为了使用您的模型,您可能需要使用适当的模式来准备数据库。
准备(Preparation)
你可以通过将你的模型继承Preparation
来做到这一点。
extension Pet: Preparation {
static func prepare(_ database: Database) throws {
try database.create(self) { pets in
pets.id()
pets.string("name")
pets.int("age")
}
}
static func revert(_ database: Database) throws {
try database.delete(self)
}
}
在这里,我们创建了一个简单的表,看起来如下:
id | name | age |
---|---|---|
<database id type> | string | int |
添加到Droplet(Add to Droplet)
现在,您可以将模型添加到配置的准备中,以便在应用程序启动时准备好数据库。
import Vapor
import FluentProvider
let config = try Config()
config.preparations.append(Pet.self)
let drop = try Droplet(config)
...
使用模型(Using Models)
现在我们已经创建了模型并准备好了数据库,我们可以使用它来保存和从数据库中获取数据。
保存(Save)
要保存一个模型,请调用.save()
。将自动创建模型的新标识符。
let dog = Pet(name: "Spud", age: 5)
try dog.save()
print(dog.id) // the newly saved pet's id
查找(Find)
您可以使用它的ID从数据库中获取一个模型。
guard let dog = try Pet.find(42) else {
throw Abort.notFound
}
print(dog.name) // the name of the dog with id 42
过滤器(Filter)
您还可以使用过滤器搜索模型。
let dogs = try Pet.makeQuery().filter("age", .greaterThan, 2).all()
print(dogs) // all dogs older than 2
驱动(Drivers)
查看数据库(database)部分,了解更多关于不同数据库驱动程序的信息,您可以使用Fluent的数据库驱动程序。
网友评论