0x00 Chapter 6:Configuring a Database
1.
Vapor
has official, Swift-native
drivers
for:
- SQLite
- MySQL
- PostgreSQL
- MongoDB
2.数据库类型:
关系型(relational):
MySQL
and
PostgreSQL
非关系型(non-relational):
MongoDB
SQLite
是一个简单的、基于
文件
的关系数据库系统。
它旨在嵌入到应用程序中,对于单进程应用程序(例如 iOS 应用程序)很有用
MySQL
become the
most popular
database due to its
ease of use
and support from most cloud providers and website builders
PostgreSQL
专为
企业
使用而设计。还原生支持几何图元,例如坐标
MongoDB
旨在处理大量
非结构化
数据并具有极高的
可扩展性
3.使用
SQLite
,需要的配置
SQLite
doesn’t require you to run a
database server
since SQLite uses a
local
file
Package.swift
文件的配置
a.添加依赖
dependencies: [
.package(url: "https://github.com/vapor/fluent-sqlite-driver.git", from: "4.0.0")
]
b.给名为
App
的
target
添加依赖:
dependencies: [
.product(name: "FluentSQLiteDriver", package: "fluent-sqlite-driver")
]
完整的内容:
// swift-tools-version:5.5
import PackageDescription
let package = Package(
name: "TILApp",
platforms: [
.macOS(.v12)
],
dependencies: [
// 💧 A server-side Swift web framework.
.package(url: "https://github.com/vapor/vapor.git", from: "4.0.0"),
// SQLite
.package(url: "https://github.com/vapor/fluent-sqlite-driver.git", from: "4.0.0")
],
targets: [
.target(
name: "App",
dependencies: [
.product(name: "FluentSQLiteDriver", package: "fluent-sqlite-driver")
.product(name: "Vapor", package: "vapor")
],
swiftSettings: [
.unsafeFlags(["-cross-module-optimization"], .when(configuration: .release))
]
),
.executableTarget(name: "Run", dependencies: [.target(name: "App")]),
.testTarget(name: "AppTests", dependencies: [
.target(name: "App"),
.product(name: "XCTVapor", package: "vapor"),
])
]
)
configure.swift
文件的配置
a.导入
FluentSQLiteDriver
import FluentSQLiteDriver
b.
configure
方法内添加
app.databases.use(.sqlite(.memory), as: .sqlite)
放在
app.migrations.add(CreateAcronym())
前面
如果要保存到文件
app.databases.use(.sqlite(.file("db.aqlite")), as: .sqlite)
4.使用
MySQL
,需要的配置
run the
MySQL server
in a
Docker
container
在终端运行一个
MySQL server
docker run --name mysql \
-e MYSQL_USER=vapor_username \
-e MYSQL_PASSWORD=vapor_password \
-e MYSQL_DATABASE=vapor_database \
-e MYSQL_RANDOM_ROOT_PASSWORD=yes \
-p 3306:3306 \
-d mysql
检查数据库是否运行起来:
docker ps
Package.swift
文件的配置
a.添加依赖
dependencies: [
.package(url: "https://github.com/vapor/fluent-mysql-driver.git", from: "4.0.0")
]
b.给名为
App
的
target
添加依赖:
dependencies: [
.product(name: "FluentMySQLDriver", package: "fluent-mysql-driver")
]
configure.swift
文件的配置
a.导入
FluentMySQLDriver
import FluentMySQLDriver
b.
configure
方法内添加
app.databases.use(.mysql(
hostname: Environment.get("DATABASE_HOST") ?? "localhost",
username: Environment.get("DATABASE_USERNAME") ?? "vapor_username",
password: Environment.get("DATABASE_PASSWORD") ?? "vapor_password",
database: Environment.get("DATABASE_NAME") ?? "vapor_database",
tlsConfiguration: .forClient(certificateVerification: .none)), as: .mysql)
放在
app.migrations.add(CreateAcronym())
前面
5.使用
MongoDB
,需要的配置
run the
MongoDB server
in a
Docker
container
在终端运行一个
MySQL server
docker run --name mongo \
-e MONGO_INITDB_DATABASE=vapor \
-p 27017:27017 \
-d mongo
Package.swift
文件的配置
a.添加依赖
dependencies: [
.package(url: "https://github.com/vapor/fluent-mongo-driver.git", from: "1.0.0")
]
b.给名为
App
的
target
添加依赖:
dependencies: [
.product(name: "FluentMongoDriver", package: "fluent-mongo-driver")
]
configure.swift
文件的配置
a.导入
FluentMongoDriver
import FluentMongoDriver
b.
configure
方法内添加
try app.databases.use(.mongo(connectionString: "mongodb://localhost:27017/vapor"), as: .mongo)
放在
app.migrations.add(CreateAcronym())
前面
6.使用
PostgreSQL
,需要的配置
run the
PostgreSQL server
in a
Docker
container
docker run --name postgres \
-e POSTGRES_DB=vapor_database \
-e POSTGRES_USER=vapor_username \
-e POSTGRES_PASSWORD=vapor_password \
-p 5432:5432 \
-d postgres
Package.swift
文件的配置
a.添加依赖
dependencies: [
.package(url: "https://github.com/vapor/fluent-postgres-driver.git", from: "2.0.0")
]
b.给名为
App
的
target
添加依赖:
dependencies: [
.product(name: "FluentPostgresDriver", package: "fluent-postgres-driver")
]
configure.swift
文件的配置
a.导入
FluentPostgresDriver
import FluentPostgresDriver
b.
configure
方法内添加
app.databases.use(.postgres(
hostname: Environment.get("DATABASE_HOST") ?? "localhost",
username: Environment.get("DATABASE_USERNAME") ?? "vapor_username",
password: Environment.get("DATABASE_PASSWORD") ?? "vapor_password",
database: Environment.get("DATABASE_NAME") ?? "vapor_database"
), as: .psql)
放在
app.migrations.add(CreateAcronym())
前面
7.依赖对比