Kitura

APIDoc Build Status - Master macOS Linux Apache 2 Slack Status

Swift-Kuery-PostgreSQL

用于 Swift-Kuery 框架的 PostgreSQL 插件。它使您能够使用 Swift-Kuery 来操作 PostgreSQL 数据库中的数据。

PostgreSQL 客户端安装

要使用 Swift-Kuery-PostgreSQL,您必须安装适当的 PostgreSQL C 语言客户端。

macOS

$ brew install postgresql

Linux

$ sudo apt-get install libpq-dev

用法

添加依赖项

SwiftKueryPostgreSQL 包添加到应用程序 Package.swift 文件中的依赖项中。将 "x.x.x" 替换为最新的 SwiftKueryPostgreSQL 版本

.package(url: "https://github.com/Kitura/Swift-Kuery-PostgreSQL.git", from: "x.x.x")

SwiftKueryPostgreSQL 添加到应用程序的依赖项

.target(name: "Application", dependencies: ["SwiftKueryPostgreSQL"]),

导入包

import SwiftKueryPostgreSQL

使用 Swift-Kuery-PostgreSQL

首先通过调用以下代码创建 Swift-Kuery-PostgreSQL 的实例

let connection = PostgreSQLConnection(host: host, port: port, options: [ConnectionOptions]?)

其中

有关更多详细信息,请参阅 PostgreSQL 手册


或者,调用

let connection = PostgreSQLConnection(url: URL(string: "Postgres://\(username):\(password)@\(host):\(port)/\(databaseName)")!)

要建立与数据库的连接,请调用

connection.connect() { result in
    guard result.success else {
        // Connection not established, handle error
        return
    }
    // Connection established
}

现在您有了一个连接,可以用来执行使用 Swift-Kuery 创建的 SQL 查询。

开始在本地使用 Swift-Kuery-PostgreSQL

安装 PostgreSQL 服务器

Mac

brew install postgresql

Ubuntu Linux

sudo apt-get install postgresql postgresql-contrib

确保数据库正在运行。此安装还应安装我们需要的两个应用程序,即 (createdb 和 psql),它们将用作本地运行的 PostgreSQL 的客户端。

创建一个数据库

让我们创建一个名为 school 的数据库

createdb school

创建表

现在,让我们创建本示例所需的表。

使用交互式 psql 客户端打开我们创建的数据库

$ psql school
psql (9.5.4)
Type "help" for help.

school=#

首先,创建 student 表

CREATE TABLE student (
 studentId BIGSERIAL PRIMARY KEY,
 name varchar(100) NOT NULL CHECK (name <> '')
);

接下来,创建 grades 表

CREATE TABLE grades (
  key BIGSERIAL PRIMARY KEY,
  studentId integer NOT NULL,
  course varchar(40) NOT NULL,
  grade integer
);

填充表

首先是 students 表

INSERT INTO student VALUES (1, 'Tommy Watson');
INSERT INTO student VALUES (2, 'Fred Flintstone');

然后是 grades 表

INSERT INTO grades (studentId, course, grade) VALUES (1, 'How to build your first computer', 99);
INSERT INTO grades (studentId, course, grade) VALUES (2, 'How to work at a rock quarry', 71);

使用 Swift-Kuery

现在我们可以从 Swift 连接到我们的数据库,并使用 Swift-Kuery 将数据查询到我们的 Swift 应用程序中。

创建简单的 Swift 可执行文件

首先为我们的项目创建一个目录,然后初始化它。

$ mkdir swift-kuery-play
$ cd swift-kuery-play
$ swift package init --type executable
Creating executable package: swift-kuery-play
Creating Package.swift
Creating README.md
Creating .gitignore
Creating Sources/
Creating Sources/swift-kuery-play/main.swift
Creating Tests/
$

现在,将 Swift-Kuery-PostgreSQL 添加为我们项目的依赖项,这将自动拉取 Swift-Kuery。编辑 Package.swift 以包含以下内容,将 "x.x.x" 替换为最新的 KituraSwift-Kuery-PostgreSQL 版本。

// swift-tools-version:4.0
import PackageDescription

let package = Package(
    name: "swift-kuery-play",
    dependencies: [
        .package(url: "https://github.com/Kitura/Kitura.git", from: "x.x.x"),
        .package(url: "https://github.com/Kitura/Swift-Kuery-PostgreSQL", from: "x.x.x")
    ],
    targets: [
        .target(
            name: "swift-kuery-play",
            dependencies: ["Kitura", "SwiftKueryPostgreSQL"]),
    ]
)

现在,编辑您的 main.swift 文件以包含

import SwiftKuery
import SwiftKueryPostgreSQL
import Kitura

let router = Router()

class Grades : Table {
  let tableName = "grades"
  let key = Column("key")
  let course = Column("course")
  let grade = Column("grade")
  let studentId = Column("studentId")
}

let grades = Grades()

let connection = PostgreSQLConnection(host: "localhost", port: 5432, options: [.databaseName("school")])

func grades(_ callback: @escaping (String) -> Void) -> Void {
    connection.connect() { result in
        guard result.success else {
            guard let error = result.asError else {
                return callback("Error connecting: Unknown Error")
            }
            return callback("Error connecting: \(error)")
        }
        // Build and execute your query here.

        // First build query
        let query = Select(grades.course, grades.grade, from: grades)

        // Execute query
        connection.execute(query: query) { result in
            guard let resultSet = result.asResultSet else {
                guard let error = result.asError else {
                    return callback("Error executing query: Unknown Error")
                }
                return callback("Error executing query: \(error)")
            }
            var retString = ""
            resultSet.getColumnTitles() { titles, error in
                guard let titles = titles else {
                    guard let error = error else {
                        return callback("Error fetching column titles: Unknown Error")
                    }
                    return callback("Error fetching column titles: \(error)")
                }
                for title in titles {
                    //The column names of the result.
                    retString.append("\(title.padding(toLength: 35, withPad: " ", startingAt: 0))")
                }
                retString.append("\n")

                resultSet.forEach() { row, error in
                    guard let row = row else {
                        // A null row means we have run out of results unless we encountered an error
                        if let error = error {
                            return callback("Error fetching row: \(error)")
                        }
                        // No error so all rows are processed, make final callback passing result.
                        return callback(retString)
                    }
                    for value in row {
                        if let value = value {
                            let valueString = String(describing: value)
                            retString.append("\(valueString.padding(toLength: 35, withPad: " ", startingAt: 0))")
                        }
                    }
                    retString.append("\n")
                }
            }
        }
    }
}

router.get("/") {
  request, response, next in

  grades() {
    resp in
    response.send(resp)
    next()
  }
}

Kitura.addHTTPServer(onPort: 8080, with: router)
Kitura.run()

现在构建并运行该程序

$ swift build
$ .build/debug/swift-kuery-play

现在打开一个网页到 https://:8080,您应该看到

course                             grade                              
How to build your first computer   99                                 
How to work at a rock quarry       71      

现在我们可以更改我们的查询行,并看到不同的结果。

更改该行

      let query = Select(grades.course, grades.grade, from: grades)

      let query = Select(grades.course, grades.grade, from: grades)
        .where(grades.grade > 80)

我们应该只看到大于 80 的 grades

course                             grade                              
How to build your first computer   99                                 

另一种可能性是使用 QueryResult.asRows,它将结果作为字典数组返回,其中每个字典表示结果的一行,列标题作为键。
如下所示更改您的 grades 函数

func grades(_ callback: @escaping (String) -> Void) -> Void {
    connection.connect() { result in
        guard result.success else {
            guard let error = result.asError else {
                return callback("Error connecting: Unknown Error")
            }
            return callback("Error connecting: \(error)")
        }
        let query = Select(grades.course, grades.grade, from: grades)
        connection.execute(query: query) { result in
            result.asRows() { rows, error in
                guard let rows = rows else {
                    guard let error = error else {
                        return callback("Error getting rows: Unknown Error")
                    }
                    return callback("Error getting rows: \(error)")
                }
                var retString = ""
                for row in rows {
                    for (title, value) in row {
                        if let value = value {
                            retString.append("\(title): \(value) ")
                        }
                    }
                    retString.append("\n")
                }
                return callback(retString)
            }
        }
    }
}

https://:8080 您应该看到

grade: 99 course: How to build your first computer
grade: 71 course: How to work at a rock quarry  

API 文档

有关更多信息,请访问我们的 API 参考

社区

我们喜欢讨论服务器端 Swift 和 Kitura。 加入我们的 Slack 来认识我们的团队!

许可证

此库在 Apache 2.0 许可下获得许可。 完整的许可证文本可在 LICENSE 中找到