Vapor奇幻之旅(06 PostgreSQL)

用Vapor連接數(shù)據(jù)庫(kù)是一件令人興奮的事畅姊,本篇就來(lái)介紹如何使用Vapor來(lái)連接PostgreSQL數(shù)據(jù)庫(kù)澎粟,將數(shù)據(jù)持久化唉韭。

在上一篇Vapor奇幻之旅(05 Fluent)中陶珠,我介紹了如何使用Fluent創(chuàng)建數(shù)據(jù)模型蒋譬,并在自帶的內(nèi)存數(shù)據(jù)庫(kù)中進(jìn)行增刪改查操作。用這種方法可以方便的進(jìn)行接口測(cè)試和數(shù)據(jù)測(cè)試愉适,不需要額外部署數(shù)據(jù)庫(kù)環(huán)境犯助,對(duì)于調(diào)試程序和測(cè)試來(lái)說(shuō)好處不言而喻。而在web應(yīng)用的使用中租副,對(duì)數(shù)據(jù)的持久化是必不可少的坐慰,于是我們就需要通過程序來(lái)連接數(shù)據(jù)庫(kù)進(jìn)行數(shù)據(jù)操作,這樣整個(gè)系統(tǒng)才算基本完整用僧。

什么是PostgreSQL结胀?

PostgresSQL是一個(gè)開源的面向?qū)ο蟮臄?shù)據(jù)庫(kù)赞咙,百度百科上的介紹非常不準(zhǔn)確,英文好的朋友還是建議看官方文檔:
PostgreSQL 10
PostgreSQL 9.6

這里不詳細(xì)解釋數(shù)據(jù)庫(kù)的用法糟港,我給出一些主要特性:

  • 復(fù)雜查詢
  • 支持外鍵
  • 觸發(fā)器
  • 可更新視圖
  • 事務(wù)完整
  • 多版本并發(fā)控制

PostgreSQL同樣具有非常靈活的可擴(kuò)展性攀操,支持大部分的sql標(biāo)準(zhǔn), 再加上是開源并免費(fèi)的,所以適用于任何用途秸抚,總的來(lái)說(shuō)就是好用不上火速和。

關(guān)于數(shù)據(jù)庫(kù)的用法這篇文章不會(huì)覆蓋太多,感興趣的朋友可以去看看相關(guān)的文章剥汤。

安裝PostgreSQL

官方給出的安裝方法:
在ubuntu上安裝
在Mac上安裝

下面是安裝步驟

  • ubuntu14.04:
    1健芭、創(chuàng)建文件/etc/apt/sources.list.d/pgdg.list 并添加以下內(nèi)容
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秀姐、創(chuàng)建文件/etc/apt/sources.list.d/pgdg.list 并添加以下內(nèi)容
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系統(tǒng)中默認(rèn)root沒有權(quán)限操作postgreSQL若贮,需要切換到postgres這個(gè)用戶才能訪問

$ sudo su - postgres

測(cè)試是否安裝成功:

$ psql --help
  • Mac:

簡(jiǎn)單粗暴:

$ brew install postgresql
$ ln -sfv /usr/local/opt/postgresql/*.plist ~/Library/LaunchAgents
$ postgres -D /usr/local/var/postgres

測(cè)試是否安裝成功:

$ psql --help

啟動(dòng)和停止:

// 停止postgresql
$ brew services stop postgresql
// 啟動(dòng)postgresql
$ brew services start postgresql

現(xiàn)在PostgreSQL已經(jīng)安裝好了省有,下面是幾個(gè)基本操作:
創(chuàng)建數(shù)據(jù)庫(kù):

$ createdb mydb

進(jìn)入我的數(shù)據(jù)庫(kù):

psql mydb

這時(shí)候你就可以在里面執(zhí)行sql了,記得輸入命令后加上分號(hào)(;)谴麦,否則回車代表?yè)Q行蠢沿。

圖形化工具pgAdmin

1、下載安裝pgAdmin

2匾效、添加一個(gè)新的server:


點(diǎn)擊按鈕添加新的server

3舷蟀、指定一個(gè)server的名稱:


image.png

4、配置connection


image.png

5面哼、包促進(jìn)配置野宜,如果成功就會(huì)連接數(shù)據(jù)庫(kù),如果沒有成功魔策,請(qǐng)檢查配置是否正確匈子,成功后我們就可以看到我們的數(shù)據(jù)庫(kù)被成功添加了


image.png

項(xiàng)目中添加PostgreSQL Provider

修改前一篇文章項(xiàng)目中的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"])
    ]
)

命令行到項(xiàng)目文件夾,更新vapor:

$ vapor update

待完成之后項(xiàng)目里就會(huì)集成 PostgreSQL Provider
如果此時(shí)運(yùn)行程序闯袒,會(huì)報(bào)找不到CPostgreSQL虎敦,我們需要添加這個(gè)lib的支持:

$ brew install postgresql pkg-config

在linux環(huán)境下執(zhí)行:

apt-get update
apt-get upgrade
apt-get install postgresql postgresql-contrib

這樣這個(gè)c庫(kù)就下載下來(lái)了

配置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政敢、修改驅(qū)動(dòng):
在項(xiàng)目Config/fluent.json中修改driver屬性(默認(rèn)是memory):

"driver": "postgresql"

3其徙、配置連接:
創(chuàng)建Config/secrets/postgresql.json文件,在config文件夾下先創(chuàng)建secrets文件夾喷户,再創(chuàng)建postgresql.json文件唾那,并添加配置內(nèi)容:

{
    "hostname": "127.0.0.1",
    "user": "leacode",
    "password": "12345",
    "database": "leacode",
    "port": 5432
}

也可以用url的形式來(lái)寫這個(gè)配置文件

{
    "url": "psql://leacode: 12345@127.0.0.1:5432/leacode"
}

這時(shí)候運(yùn)行程序,執(zhí)行Vapor奇幻之旅(05 Fluent)中的增刪改查操作褪尝,可以看到和上一篇一樣的效果通贞,到這里朗若,我們的數(shù)據(jù)庫(kù)已經(jīng)連接完成。

背后發(fā)生了什么昌罩?

PostgreSQL Provider為我們提供了連接到數(shù)據(jù)庫(kù)的driver哭懈,就像pgAdmin 4一樣使我么你的程序能夠連接到數(shù)據(jù)庫(kù)進(jìn)行相應(yīng)的操作。

Fluent通過我們寫的Preparation來(lái)準(zhǔn)備數(shù)據(jù)庫(kù)的表:

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到底創(chuàng)建了什么表:


image.png

看看fluent表里有些什么


image.png

可以看到fluent表中包含我們創(chuàng)建的對(duì)象茎用,其中Post是創(chuàng)建程序默認(rèn)的model遣总,可以刪掉,Quotes是我們自定義的一個(gè)model轨功,至此我們?cè)跊]有寫一句sql的情況下創(chuàng)建了數(shù)據(jù)庫(kù)的表旭斥,并完成了增刪改查操作。

現(xiàn)在古涧,當(dāng)我們重新運(yùn)行程序并執(zhí)行查詢操作時(shí)垂券,可以發(fā)現(xiàn)上一次運(yùn)行插入的數(shù)據(jù)依然存在,我們完成了數(shù)據(jù)的持久化羡滑。

后面我會(huì)補(bǔ)充一篇文章講解服務(wù)端數(shù)據(jù)庫(kù)的配置菇爪,關(guān)于Vapor其他知識(shí),可以參考以下文章:

Vapor奇幻之旅(01開始)
Vapor奇幻之旅(02部署)
Vapor奇幻之旅(03上手)
Vapor奇幻之旅(04Routing)
Vapor奇幻之旅(05 Fluent)
Vapor奇幻之旅(06 PostgreSQL)
Vapor奇幻之旅(07 連接服務(wù)端PostgreSQL)
Vapor奇幻之旅(08 連接服務(wù)端MongoDB)
Vapor奇幻之旅(09 連接MySQL)

希望你對(duì)我的教程能夠喜歡柒昏,你們的贊是我持續(xù)的動(dòng)力凳宙,歡迎加入QQ群參與互動(dòng):431296189

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市职祷,隨后出現(xiàn)的幾起案子氏涩,更是在濱河造成了極大的恐慌,老刑警劉巖有梆,帶你破解...
    沈念sama閱讀 210,978評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件是尖,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡泥耀,警方通過查閱死者的電腦和手機(jī)析砸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)爆袍,“玉大人首繁,你說(shuō)我怎么就攤上這事≡赡遥” “怎么了弦疮?”我有些...
    開封第一講書人閱讀 156,623評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)蜘醋。 經(jīng)常有香客問我胁塞,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,324評(píng)論 1 282
  • 正文 為了忘掉前任啸罢,我火速辦了婚禮编检,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘扰才。我一直安慰自己允懂,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,390評(píng)論 5 384
  • 文/花漫 我一把揭開白布衩匣。 她就那樣靜靜地躺著蕾总,像睡著了一般。 火紅的嫁衣襯著肌膚如雪琅捏。 梳的紋絲不亂的頭發(fā)上生百,一...
    開封第一講書人閱讀 49,741評(píng)論 1 289
  • 那天,我揣著相機(jī)與錄音柄延,去河邊找鬼蚀浆。 笑死,一個(gè)胖子當(dāng)著我的面吹牛搜吧,可吹牛的內(nèi)容都是我干的市俊。 我是一名探鬼主播,決...
    沈念sama閱讀 38,892評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼赎败,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了蠢甲?” 一聲冷哼從身側(cè)響起僵刮,我...
    開封第一講書人閱讀 37,655評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎鹦牛,沒想到半個(gè)月后搞糕,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,104評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡曼追,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年窍仰,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片礼殊。...
    茶點(diǎn)故事閱讀 38,569評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡驹吮,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出晶伦,到底是詐尸還是另有隱情碟狞,我是刑警寧澤,帶...
    沈念sama閱讀 34,254評(píng)論 4 328
  • 正文 年R本政府宣布婚陪,位于F島的核電站族沃,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜脆淹,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,834評(píng)論 3 312
  • 文/蒙蒙 一常空、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧盖溺,春花似錦漓糙、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至拙友,卻和暖如春为狸,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背遗契。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工辐棒, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人牍蜂。 一個(gè)月前我還...
    沈念sama閱讀 46,260評(píng)論 2 360
  • 正文 我出身青樓漾根,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親鲫竞。 傳聞我的和親對(duì)象是個(gè)殘疾皇子辐怕,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,446評(píng)論 2 348