Fluent数据库负责管理与底层数据存储的连接,并向您选择的实现特定驱动程序发送查询。
驱动(Drivers)
默认情况下,Fluent包括内存和SQLite驱动程序。有几个驱动程序可用于添加到您的Vapor应用程序。
可用(Available)
类型Type | 键Key | 包Package | 类Class | 官方Official |
---|---|---|---|---|
Memory | memory | Fluent Provider | Fluent.MemoryDriver | Yes |
SQlite | sqlite | Fluent Provider | Fluent.SQLiteDriver | Yes |
MySQL | mysql | MySQLProvider | MySQLDriver.Driver | Yes |
PostgreSQL | postgresql | PostgreSQLProvider | PostgreSQLDriver.Driver | No |
MongoDB | N/A | MongoProvider | N/A | No |
单击提供程序包以获取有关如何使用它的更多信息。
您可以在GitHub上搜索可用的Vapor数据库提供程序列表。
Droplet
您可以从Droplet访问数据库。
drop.database // Database?
准备(Preparations)
大多数数据库(如SQL数据库)需要在存储模型之前创建模型。为您的模型添加准备将允许您在应用程序引导时准备数据库。
extension User: Preparation {
/// Prepares a table/collection in the database准备数据库中的表/集合
/// for storing Users存储用户
static func prepare(_ database: Database) throws {
try database.create(self) { builder in
builder.id()
builder.string("name")
builder.int("age")
}
}
/// Undoes what was done in `prepare`撤消在“prepare”中所做的工作
static func revert(_ database: Database) throws {
try database.delete(self)
}
}
以上准备语句的结果与SQL类似如下:
CREATE TABLE `users` (`id` INTEGER PRIMARY KEY NOT NULL, `name` TEXT NOT NULL, `age` INTEGER NOT NULL)
创建完准备后,将其添加到Config的prepratations数组中。
config.preparations.append(User.self)
创建(Create)
在创建和修改数据库时可以使用以下方法。
方法Method | 类型Type |
---|---|
id | 主标识符Primary Identifier |
foreignId | 外来识别码Foreign Identifier |
int | 整数Integer |
string | 字符串String |
double | Double |
bool | Boolean |
bytes | 数据Data |
date | 日期+时间Date + Time |
您可以在其中的构建器上使用任何这些方法.create()。
try database.create(self) { builder in
builder.double("latitude")
builder.double("longitude")
}
外键(Foreign Keys)
外键自动添加.foreignId()
。要手动添加外键,请使用该 .foreignKey
方法。
try database.create(self) { builder in
builder.foreignKey("user_id", references: "id", on: User.self)
}
要禁用自动外键,在Config/fluent.json
文件中设置autoForeignKeys
为false 。
{
"autoForeignKeys": false
}
修饰(Modifier)
可以使用.modify()属性修改现有模式。所有的方法.create() 也可以在这里。
try database.modify(self) { builder in
builder.string("name")
builder.delete("age")
}
迁移(Migrations)
其他时候,您可能希望在迁移到新版本或执行一般清理时对数据集进行一些修改。
struct DeleteOldEntries: Preparation {
static func prepare(_ database: Database) throws {
try Log.makeQuery().filter(...).delete()
}
...
}
运行(Run)
您的准备工作将在每次运行应用程序时运行。您可以运行您的准备工作,而无需启动您的服务器:
vapor run prepare
还原(Revert)
使用还原方法撤消在prepare方法中所做的任何工作。
extension User: Preparation {
...
static func revert(_ database: Database) throws {
try database.delete(self)
}
}
你可以通过调用以下方式来运行反转:
vapor run prepare --revert
这将恢复最新的一批准备工作。要还原整个数据库,请运行以下命令:
vapor run prepare --revert --all
日志(Log)
记录查询是找到应用程序优化并追踪错误的好方法。
记录查询的最简单方法是启用登录fluent.json文件。
Config/fluent.json
{
...,
"log": true,
...
}
这将发出所有数据库查询的信息级日志。
自定义(Custom)
您还可以挂接到数据库的查询记录回调以执行自定义逻辑。
drop.database?.log = { query in
print(query)
}
您可以log
为数据库上的属性分配一个闭包。任何时候运行查询,将使用QueryLog
包含描述语句和运行时间的字符串的对象来调用闭包。
处理(Transactions)
事务处理允许您将多个查询分组到一个单独的工作单元中。如果任何一个查询遇到问题,整个事务将被回滚。
drop.database?.transaction { conn in
try user.pets.makeQuery(conn).delete()
try user.makeQuery(conn).delete()
}
如果调用此方法,不支持事务处理的驱动程序将抛出错误。
您可以使用该.makeQuery(_: Executor)
方法创建将在提供给关闭的连接上运行的查询。
警告
您必须使用到闭包提供的连接,以便在事务处理中包含您想要包含的查询
索引(Indexes)
索引是从可以非常有效地搜索的表中选择的数据列的副本。
您可以通过调用.index()
将它们添加到数据库
try database.index("name", for: User.self)
您可以通过调用.deleteIndex()
删除它们
try database.deleteIndex("name", for: User.self)