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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏代码散人

Vapor奇幻之旅(08 连接服务端MongoDB)

首先付上官网的安装教程:安装mongodb,这个是社区版,由于企业版是收费的,就先来个社区版以供测试使用。

9030
来自专栏帘卷西风的专栏

关于cocos2dx程序的BUG调试解决方案

      今天说一下手机游戏开发的调试问题吧。不得不说的是和PC平台游戏、软件开发相比,手机上开发游戏和软件要困难的多。原因是多方面的,比如说开发环境比较复杂...

10320
来自专栏安恒信息

预警 | Xshell、Xmanager、Xftp等远程管理产品源码被植入后门

Xmanager、Xshell、Xftp为NetSarang公司开发,主要应用于访问和管理远程服务器。 NetSarang公司在8月7日发布安全公告,称其最近更...

39560
来自专栏伪君子的梦呓

用 selenium 和 scrapy 模拟知乎登录

这个是看一个视频学来的,视频给出的教程部分失效,因为知乎的登录页面改了。我进行一点修改就可以登录了,本文主要是记录

17830
来自专栏张戈的专栏

安装完Win7之后推荐做的一些设置

前言:不知道写什么,就总结一下我个人安装完成 windows7 之后要做的一些设置吧!以下全文均为个人回忆总结,文章也很冗长,难免有纰漏或者不符合你个人习惯的内...

1.1K140
来自专栏图像识别与深度学习

Android Studio下打jar包及使用jar包

68950
来自专栏idealclover的填坑日常

XAMPP+PhpStorm+Xdebug调试本地网页

因为要折腾自己的Wordpress博客,所以不得已入坑了世界上最好的语言qwq第一步就是所说的配置本地的调试环境啦~总不能一上来就在服务器上写吧orz

25610
来自专栏菩提树下的杨过

在win2008 r2中安装windows phone 7开发工具

默认情况下,windows phone7开发工具只能在windows7上安装,我的本本上好不容易把win2008 r2以及相关软件安装好,总不能因为这个又把wi...

19570
来自专栏落影的专栏

iOS开发笔记(五)

前言 社会的模式很多是重复的,当你做一样事情很擅长时,与之类似的事情也能触类旁通。 正文 Code开发 1、delegate的trick 很多人习惯在调用de...

52240
来自专栏腾讯NEXT学位

React 16 加载性能优化指南(上)

公司的新项目迁移到了 React 16 和 Webpack 4.0,写一篇文章来总结一下。

71350

扫码关注云+社区

领取腾讯云代金券