Vapor奇幻之旅(06 PostgreSQL)

用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:


点击按钮添加新的server

3、指定一个server的名称:


image.png

4、配置connection


image.png

5、包促进配置,如果成功就会连接数据库,如果没有成功,请检查配置是否正确,成功后我们就可以看到我们的数据库被成功添加了


image.png

项目中添加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: 12345@127.0.0.1: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到底创建了什么表:


image.png

看看fluent表里有些什么


image.png

可以看到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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 151,688评论 1 330
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 64,559评论 1 273
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 101,749评论 0 226
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 42,581评论 0 191
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 50,741评论 3 271
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 39,684评论 1 192
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,122评论 2 292
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 29,847评论 0 182
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 33,441评论 0 228
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 29,939评论 2 232
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,333评论 1 242
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 27,783评论 2 236
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,275评论 3 220
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,830评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,444评论 0 180
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 34,553评论 2 249
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 34,618评论 2 249