用于 Swift-Kuery 框架的 PostgreSQL 插件。它使您能够使用 Swift-Kuery 来操作 PostgreSQL 数据库中的数据。
要使用 Swift-Kuery-PostgreSQL,您必须安装适当的 PostgreSQL C 语言客户端。
$ brew install postgresql
$ 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
的实例
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 查询。
brew install postgresql
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 连接到我们的数据库,并使用 Swift-Kuery 将数据查询到我们的 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"
替换为最新的 Kitura
和 Swift-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 参考。
我们喜欢讨论服务器端 Swift 和 Kitura。 加入我们的 Slack 来认识我们的团队!
此库在 Apache 2.0 许可下获得许可。 完整的许可证文本可在 LICENSE 中找到