用Vapor连接数据库是一件令人兴奋的事,本篇就来介绍如何使用Vapor来连接PostgreSQL数据库,将数据持久化。
在上一篇Vapor奇幻之旅(05 Fluent)中,我介绍了如何使用Fluent创建数据模型,并在自带的内存数据库中进行增删改查操作。用这种方法可以方便的进行接口测试和数据测试,不需要额外部署数据库环境,对于调试程序和测试来说好处不言而喻。而在web应用的使用中,对数据的持久化是必不可少的,于是我们就需要通过程序来连接数据库进行数据操作,这样整个系统才算基本完整。
什么是PostgreSQL?
PostgresSQL是一个开源的面向对象的数据库,百度百科上的介绍非常不准确,英文好的朋友还是建议看官方文档:
PostgreSQL 10
PostgreSQL 9.6
这里不详细解释数据库的用法,我给出一些主要特性:
- 复杂查询
- 支持外键
- 触发器
- 可更新视图
- 事务完整
- 多版本并发控制
PostgreSQL同样具有非常灵活的可扩展性,支持大部分的sql标准, 再加上是开源并免费的,所以适用于任何用途,总的来说就是好用不上火。
关于数据库的用法这篇文章不会覆盖太多,感兴趣的朋友可以去看看相关的文章。
安装PostgreSQL
官方给出的安装方法:
在ubuntu上安装
在Mac上安装
下面是安装步骤
- ubuntu14.04:
1、创建文件/etc/apt/sources.list.d/pgdg.list 并添加以下内容
deb http://apt.postgresql.org/pub/repos/apt/ trusty-pgdg main
2、安装
$ wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | \
sudo apt-key add -
$ sudo apt-get update
- ubuntu16.04:
1、创建文件/etc/apt/sources.list.d/pgdg.list 并添加以下内容
deb http://apt.postgresql.org/pub/repos/apt/ xenial-pgdg main
2、安装
$ wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | \
sudo apt-key add -
$ sudo apt-get update
由于ubuntu系统中默认root没有权限操作postgreSQL,需要切换到postgres这个用户才能访问
$ sudo su - postgres
测试是否安装成功:
$ psql --help
- Mac:
简单粗暴:
$ brew install postgresql
$ ln -sfv /usr/local/opt/postgresql/*.plist ~/Library/LaunchAgents
$ postgres -D /usr/local/var/postgres
测试是否安装成功:
$ psql --help
启动和停止:
// 停止postgresql
$ brew services stop postgresql
// 启动postgresql
$ brew services start postgresql
现在PostgreSQL已经安装好了,下面是几个基本操作:
创建数据库:
$ createdb mydb
进入我的数据库:
psql mydb
这时候你就可以在里面执行sql了,记得输入命令后加上分号(;),否则回车代表换行。
图形化工具pgAdmin
1、下载安装pgAdmin
2、添加一个新的server:
3、指定一个server的名称:
4、配置connection
5、包促进配置,如果成功就会连接数据库,如果没有成功,请检查配置是否正确,成功后我们就可以看到我们的数据库被成功添加了
项目中添加PostgreSQL Provider
修改前一篇文章项目中的Package.swift:
// swift-tools-version:4.0
import PackageDescription
let package = Package(
name: "VaporPostgreSQL",
products: [
.library(name: "App", targets: ["App"]),
.executable(name: "Run", targets: ["Run"])
],
dependencies: [
.package(url: "https://github.com/vapor/vapor.git", .upToNextMajor(from: "2.1.0")),
.package(url: "https://github.com/vapor/fluent-provider.git", .upToNextMajor(from: "1.3.0")),
.package(url: "https://github.com/vapor-community/postgresql-provider.git", .upToNextMajor(from: "2.1.0"))
],
targets: [
.target(
name: "App",
dependencies: ["Vapor", "FluentProvider", "PostgreSQLProvider"],
exclude: ["Config", "Database", "Localization", "Public", "Resources"]
),
.target(name: "Run", dependencies: ["App"]),
.testTarget(name: "AppTests", dependencies: ["App", "Testing"])
]
)
命令行到项目文件夹,更新vapor:
$ vapor update
待完成之后项目里就会集成 PostgreSQL Provider
如果此时运行程序,会报找不到CPostgreSQL,我们需要添加这个lib的支持:
$ brew install postgresql pkg-config
在linux环境下执行:
apt-get update
apt-get upgrade
apt-get install postgresql postgresql-contrib
这样这个c库就下载下来了
配置PostgreSQL Provider
1、在Config+Setup.swift中添加provider
import PostgreSQLProvider
...
/// Configure providers
private func setupProviders() throws {
try addProvider(FluentProvider.Provider.self)
try addProvider(PostgreSQLProvider.Provider.self)
}
2、修改驱动:
在项目Config/fluent.json中修改driver属性(默认是memory):
"driver": "postgresql"
3、配置连接:
创建Config/secrets/postgresql.json文件,在config文件夹下先创建secrets文件夹,再创建postgresql.json文件,并添加配置内容:
{
"hostname": "127.0.0.1",
"user": "leacode",
"password": "12345",
"database": "leacode",
"port": 5432
}
也可以用url的形式来写这个配置文件
{
"url": "psql://leacode: [email protected]:5432/leacode"
}
这时候运行程序,执行Vapor奇幻之旅(05 Fluent)中的增删改查操作,可以看到和上一篇一样的效果,到这里,我们的数据库已经连接完成。
背后发生了什么?
PostgreSQL Provider为我们提供了连接到数据库的driver,就像pgAdmin 4一样使我么你的程序能够连接到数据库进行相应的操作。
Fluent通过我们写的Preparation来准备数据库的表:
extension Quotes: Preparation {
static func prepare(_ database: Database) throws {
try database.create(self) { quotes in
quotes.id()
quotes.string("author")
quotes.string("content")
quotes.string("description")
}
}
static func revert(_ database: Database) throws {
try database.delete(self)
}
}
通过pgAdmin可以查看Fluent到底创建了什么表:
看看fluent表里有些什么
可以看到fluent表中包含我们创建的对象,其中Post是创建程序默认的model,可以删掉,Quotes是我们自定义的一个model,至此我们在没有写一句sql的情况下创建了数据库的表,并完成了增删改查操作。
现在,当我们重新运行程序并执行查询操作时,可以发现上一次运行插入的数据依然存在,我们完成了数据的持久化。
后面我会补充一篇文章讲解服务端数据库的配置,关于Vapor其他知识,可以参考以下文章:
Vapor奇幻之旅(01开始)
Vapor奇幻之旅(02部署)
Vapor奇幻之旅(03上手)
Vapor奇幻之旅(04Routing)
Vapor奇幻之旅(05 Fluent)
Vapor奇幻之旅(06 PostgreSQL)
Vapor奇幻之旅(07 连接服务端PostgreSQL)
Vapor奇幻之旅(08 连接服务端MongoDB)
Vapor奇幻之旅(09 连接MySQL)
希望你对我的教程能够喜欢,你们的赞是我持续的动力,欢迎加入QQ群参与互动:431296189