Vapor 大型教程
配置数据库
Vapor 3 原生支持 SQLite、MySQL、PostgreSQL 三种关系型数据库。本文带你认识它们,并学会用 configure.swift 把 SQLite 配起来开始开发。
Vapor 支持的数据库
Vapor 原生提供了三种数据库的驱动:SQLite、MySQL、PostgreSQL。
数据库分为两种:关系型数据库(SQL) 和 非关系型数据库(NoSQL)。关系型数据库适合存放结构化的数据,目前 Vapor 只支持关系型数据库。但不久的将来也会支持非关系型数据库。
关系型数据库面临的问题是:已经存入数据库的结构在后期可能需要变更,非关系型数据库正是为了解决这个问题而生的。
SQLite
一个简单的基于文件的关系型数据库系统,设计目标是嵌入到应用中使用,对于单进程应用很有用。它依靠文件锁保证数据库完整性,所以不适合大量写入操作的应用,也不能跨服务器使用。它适合在开发原型和测试时使用。
MySQL
一个开源关系型数据库,流行于 LAMP 应用栈中,它很容易使用,同时被大多数云提供商支持。
PostgreSQL
一个开源关系数据库。主要设计目标是商用,扩展性和标准化是它的核心目标。
Docker
我们使用 Docker 在本地布置数据库,它有别于虚拟机,很方便。MySQL 和 PostgreSQL 可以使用 Docker 部署在本地。
只使用 SQLite 可以简化开发,适用于原型开发期
为了简化数据库配置,我们使用 SQLite 使用本地文件存放数据。配置数据库:
/// Register providers first
try services.register(FluentSQLiteProvider())
// Configure a SQLite database
let sqlite = try SQLiteDatabase(storage: .file(path: "db.sqlite"))
/// Register the configured SQLite database to the database config.
var databases = DatabasesConfig()
databases.add(database: sqlite, as: .sqlite)
services.register(databases)
/// Configure migrations
var migrations = MigrationConfig()
migrations.add(model: Acronym.self, database: .sqlite)
services.register(migrations)
对应的 Package.swift 需要加入 FluentSQLite 依赖:
// swift-tools-version:4.0
import PackageDescription
let package = Package(
name: "TILApp",
dependencies: [
// 💧 A server-side Swift web framework.
.package(url: "https://github.com/vapor/vapor.git", from: "3.0.0"),
// 🔵 Swift ORM (queries, models, relations, etc) built on SQLite 3.
.package(url: "https://github.com/vapor/fluent-sqlite.git", from: "3.0.0")
],
targets: [
.target(name: "App", dependencies: ["FluentSQLite", "Vapor"]),
.target(name: "Run", dependencies: ["App"]),
.testTarget(name: "AppTests", dependencies: ["App"])
]
数据库配置是怎么工作的
数据库的配置主要在 configure.swift 文件中完成。
- 首先注册
FluentSQLiteProvider服务,这个服务是通过Fluent这个 ORM 中间层来对 SQLite 数据库进行操作的服务,让开发者可以不用理会具体的数据库。 - 然后创建数据库,因为
Vapor支持在同一个应用内使用多个数据库实例,所以添加数据库实例的方式是先创建一个数据库配置(DatabasesConfig),记录所有用到的数据库实例,然后统一注册进服务里。 - 最后把数据库要存放的数据模型和对应要存放的数据库类型绑定,统一使用
Migration服务进行注册使用。