Vapor奇幻之旅(06 PostgreSQL)

weixin_33830216發表於2018-01-24
1604032-81e6dab6938d81f8.png

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


1604032-19392358a79600c4.png
點選按鈕新增新的server

3、指定一個server的名稱:


1604032-50738b41912e7602.png
image.png

4、配置connection


1604032-40e096c0a9838fcd.png
image.png

5、包促進配置,如果成功就會連線資料庫,如果沒有成功,請檢查配置是否正確,成功後我們就可以看到我們的資料庫被成功新增了


1604032-7233db6a0999c57c.png
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到底建立了什麼表:


1604032-19c53a70cd372cff.png
image.png

看看fluent表裡有些什麼


1604032-957220e6613d77ce.png
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

相關文章