Swift Cassandra 客户端

CassandraClient 是一个用 Swift 编写的 Cassandra 客户端。该客户端基于 DataStax Cassandra C++ Driver,并用 Swift 友好的 API 和数据结构对其进行了封装。

CassandraClient API 目前公开了基于 SwiftNIO 的 Futures,以简化与基于 SwiftNIO 的服务器的集成。基于 Swift 并发的 API 也可在 Swift 5.5 及更高版本中使用。

用法

基于 Swift 并发的 API

创建客户端实例

var configuration = CassandraClient.Configuration(...)
let cassandraClient = CassandraClient(configuration: configuration)

客户端默认建立了一个会话(惰性加载),因此可以直接使用它来对配置的键空间执行查询

let result = try await cassandraClient.query(...)

客户端在不再需要时必须显式关闭

try cassandraClient.shutdown()

为不同的键空间创建会话

let session = cassandraClient.makeSession(keyspace: <KEYSPACE>)
let result = try await session.query(...)

会话在不再需要时必须显式关闭

try session.shutdown()

您也可以创建一个会话并传入一个闭包,该闭包将在退出时自动释放资源

try await cassandraClient.withSession(keyspace: <KEYSPACE>) { session in
  ...
}

运行无结果的命令(例如,insert、update、delete 或 DDL)

try await cassandraClient.run("create table ...")

或者在会话级别

try await session.run("create table ...")

运行返回适合内存的小型数据集的查询

返回模型对象,假设 Model: Codable

let result: [Model] = try await cassandraClient.query("select * from table ...")
let result: [Model] = try await session.query("select * from table ...")

或使用对行的自由转换

let values = try await cassandraClient.query("select * from table ...") { row in
  row.column(<COLUMN_NAME>).int32
}
let values = try await session.query("select * from table ...") { row in
  row.column(<COLUMN_NAME>).int32
}

运行返回不适合内存的大型数据集的查询

// `rows` is a sequence that one needs to iterate on
let rows: Rows = try await cassandraClient.query("select * from table ...")
// `rows` is a sequence that one needs to iterate on
let rows: Rows = try await session.query("select * from table ...")

基于 SwiftNIO Future 的 API

创建客户端实例

var configuration = CassandraClient.Configuration(...)
let cassandraClient = CassandraClient(configuration: configuration)

客户端默认建立了一个会话(惰性加载),因此可以直接使用它来对配置的键空间执行查询

let resultFuture = cassandraClient.query(...)

客户端在不再需要时必须显式关闭

try cassandraClient.shutdown()

为不同的键空间创建会话

let session = cassandraClient.makeSession(keyspace: <KEYSPACE>)
let resultFuture = session.query(...)

会话在不再需要时必须显式关闭

try session.shutdown()

您也可以创建一个会话并传入一个闭包,该闭包将在退出时自动释放资源

try cassandraClient.withSession(keyspace: <KEYSPACE>) { session in
  ...
}

运行无结果的命令(例如,insert、update、delete 或 DDL)

let voidFuture = cassandraClient.run("create table ...")

或者在会话级别

let voidFuture = session.run("create table ...")

运行返回适合内存的小型数据集的查询

返回模型对象,假设 Model: Codable

cassandraClient.query("select * from table ...").map { result: [Model] in
  ...
}
session.query("select * from table ...").map { result: [Model] in
  ...
}

或使用对行的自由转换

cassandraClient.query("select * from table ...") { row in
  row.column(<COLUMN_NAME>).int32
}.map { value in
  ...
}
session.query("select * from table ...") { row in
  row.column(<COLUMN_NAME>).int32
}.map { value in
  ...
}

运行返回不适合内存的大型数据集的查询

cassandraClient.query("select * from table ...").map { rows: Rows in
  // `rows` is a sequence that one needs to iterate on
  rows.map { row in
    ...
  }
}
session.query("select * from table ...").map { rows: Rows in
  // `rows` is a sequence that one needs to iterate on
  rows.map { row in
    ...
  }
}

DataStax Driver 和 libuv

该库依赖于 DataStax driverlibuv,它们作为 git 子模块包含在内。 它们都有在 Package.swift 中排除的源文件。

DataStax Driver

git 子模块位于 Sources/CDataStaxDriver/datastax-cpp-driver 下。 要更新,请执行 git fetch,然后检出所需的 tag/release。 Driver 的配置文件位于 Sources/CDataStaxDriver/extras 中。

libuv

git 子模块位于 Sources/Clibuv/libuv 下。 要更新,请执行 git fetch,然后检出所需的 tag/release。 请注意,Sources/Clibuv 中的 includeuv.h 被符号链接到 Sources/Clibuv/libuv 中的相应目录/文件。

开发环境搭建

该库的测试需要运行一个 Cassandra 数据库。

使用 Docker (大约需要 1 分钟才能准备好接受连接)

$ docker run --name cassandra -p 127.0.0.1:9042:9042 -d cassandra:3