安装PostgreSQL
使用homebrew安装,终端执行以下命令:
brew install postgresql
查看安装的版本:
psql --version
启动停止重启服务:
// 后台启动postgresql
brew services start postgresql
// 前台启动
postgres -D /usr/local/var/postgres
// 停止postgresql
brew services stop postgresql
// 重启postgresql
brew services restart postgresql
这样我们就在终端中启动了postgres服务。
设置开机自动启动
ln -sfv /usr/local/opt/postgresql/*.plist ~/Library/LaunchAgents
launchctl load ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist
卸载postgreSQL
当然是对于用homebrew安装的,才能这样卸载:
brew uninstall postgres
取消开机启动服务(如果配置了):
launchctl unload -w ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist
rm -rf ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist
好了,到这里基本的安装以及配置服务都已经完成了。
创建用户
createuser root -P
创建数据库:
createdb test
连接数据库
输入如下指令,连接数据库:
psql postgres
比较实用的命令:
\q 退出
\l 显示数据库
\dg 显示当前用户
\dp 显示当前数据库中表、视图及其权限等
\dt 显示当前数据库中的表
\d TABLENAME 查看表结构
安装pgAdmin4
先下载安装pgAdmin4,然后连接我们本地的PostgreSQL服务器。
打开pgAdmin4,选择Servers ->Create ->Server

填写General然后保存

填写Connection,数据库填写前面创建的users,用户名和密码用你自己的(数据库的用户可以自己添加,默认是当前电脑用户)。然后点击Save。

获取postgresql-provider
在Package.swift中添加依赖库:
import PackageDescription
let package = Package(
name: "OneVideo-Vapor",
targets: [
Target(name: "App"),
Target(name: "Run", dependencies: ["App"]),
],
dependencies: [
.Package(url: "https://github.com/vapor/vapor.git", majorVersion: 2),
.Package(url: "https://github.com/vapor/fluent-provider.git", majorVersion: 1),
.Package(url: "https://github.com/vapor/postgresql-provider.git", majorVersion: 2, minor: 0)
],
exclude: [
"Config",
"Database",
"Localization",
"Public",
"Resources",
]
)
添加之后我们需要重新打开Xcode来获取依赖包:
vapor xcode -y
引用Provider
现在相当于我们只是“下载”了新的 Provider,想要使用它,你还需要在系统中对 Provider 进行“注册”,以便你的系统能够加载这个 Provider。 Provider 的注册工作统一在 Config+Setup.swift 文件中进行,模板工程已经为你配置好了 FluentProvider。由于 Provider 不是系统原生的,所以需要在文件中先
import PostgreSQLProvider
然后在 setupProviders() 方法中加入新的 Provider:
/// Configure providers
private func setupProviders() throws {
try addProvider(FluentProvider.Provider.self)
try addProvider(PostgreSQLProvider.Provider.self)
}
配置PostgresSQL
我们需要对Postgres-Provider进行配置。按照READ ME进行配置,在Config目录下创建文件夹secrets,然后在secrets文件夹下创建postgresql.json文件,并添加如下代码:
{
"hostname": "127.0.0.1",
"user": "nnianhou",
"password": "123456",
"database": "srsq",
"port": 5432
}
使用 Fluent 提供的便捷方法来操作数据库,Fluent 默认会把数据保存在内存中,所以你需要把 Fluent 的数据驱动改为 postgresql。打开 Config\fluent.json 文件,修改如下所示的地方(必须吐槽一下,这个太不明显了):

数据库的配置就完成了
使用PostgresSQL
创建对应的Festival或Event文件,放到 Models 目录下,注意一下文件头部的引用,在 Vapor 中定义模型,需要引入:
import Vapor
import FluentProvider
import HTTP
Swift 对模型的操作都是通过扩展协议完成的,你可以参考 Post.swift 这个文件。Vapor 中的模型要比客户端中的模型复杂的多,首先为了匹配 Fluent,需要把模型定义成 class,并且遵守 Model 协议,然后实现下面的方法和构造器:
final class Festival:Model{
var date:String
var name:String
let storage = Storage()
/// 常规的构造器
init(date: String,name:String) {
self.date = date
self.name = name
}
// MARK: Fluent 序列化构造器
/// 通过这个构造器你可以使用数据库中的一行生成一个对应的对象
init(row: Row) throws {
date = try row.get("date")
name = try row.get("name")
}
// 把一个对象存储到数据库当中
func makeRow() throws -> Row {
var row = Row()
try row.set("date", date)
try row.set("name", name)
return row
}
}
Vapor 为你提供了通过模型快速建表的方法。依旧通过协议扩展的方式:
extension Festival:Preparation {
static func prepare(_ database: Database) throws {
try database.create(self, closure: { festivals in
festivals.id()
festivals.string("date")
festivals.string("name")
})
}
static func revert(_ database: Database) throws {
try database.delete(self)
}
}
有时候我们希望在 response 中可以看到新建的对象的具体信息。但是在配置路由时,需要返回的是 JSON 字符串,而不是一个 Swift 对象。此时你需要把 Swift 对象转换成一个 JSON 串,依旧是依赖协议扩展:
extension Festival: JSONRepresentable {
func makeJSON() throws -> JSON {
var json = JSON()
try json.set("id", id)
try json.set("name", name)
try json.set("date", date)
return json
}
}
和 Provider 一样,Vapor 只会操作所有“注册”过的 Preparation,所以下一步是把 Festival 注册到系统中,打开 Config+Setup.swift 文件,在对应的方法中注册:
private func setupPreparations() throws {
preparations.append(Post.self)
preparations.append(Festival.self)
}
当你通过 Fluent 对 Festival 进行增删改查的时候,如果数据库没有中没有对应的表,则会自动为你创建该表,现在让我们在 Routes.swift 写一个 Post 方法来测试一下:
post("festivals"){ req in
let text = Festival(date: "1月1日", name: "国庆节")
try text.save()
return try text.makeJSON()
}
我更推荐使用 postman,发起一个 post 请求。在 postman 中输入请求的地址,发起请求,可以看到返回了 JSON数据:

现在打开你的数据库看一下吧,在刚才的请求过程中,Vapor 自动为你创建了三张表.
注意
错误
Error could not connect to server: Connection refused Is the server running on port 5432?
Stop manually:
pg_ctl -D /usr/local/var/postgres stop -s -m fast
Start manually:
pg_ctl -D /usr/local/var/postgres -l /usr/local/var/postgres/server.log start
网友评论