适用于 Swift 的 Google Cloud BigQuery

一个用于与 Google Cloud BigQuery 交互的 Swift 实现,设计为服务器优先的解决方案。

此软件包的愿景是提供一种高级但仍具有高性能的方式,以便从 Swift 与 BigQuery 进行交互。这使用了 Swift 原生功能,如 Codable 和严格的并发性。

功能

是的,就这些。这是一个早期的开发中软件包。欢迎通过创建 issue 或 pull request 来贡献。

用法

查询

struct Row: Decodable {

    let someField: String
}

try await withBigQuery { bigQuery in
    let result = try await bigQuery.query(
        "SELECT someField FROM `my_dataset.my_table`",
        as: Row.self
    )
    // result.rows contains rows returned from BigQuery
}

也支持使用字符串插值来参数化查询。例如

struct SomeRecord: Encodable {

    let key: String
    let value: Int
}

let tableName = "my_table"
let id = "123"
let record = SomeRecord(key: "someKey", value: 123)
let array = [true, false]
let query: Query = """
    INSERT INTO `my_dataset.\(unsafe: tableName)` ( -- Must use unsafe-argument to skip paramatirization
        id,
        someRecordField,
        someArrayField
    ) VALUES (
        \(id), -- This will encode as type STRING
        \(someRecordField), -- This will encode as type STRUCT<key: STRING, value: INT64>
        \(array) -- This will encode as type ARRAY<BOOL>
    )
"""

try await bigQuery.query(query)

批量写入

批量写入是一个强大的功能,允许你在单个流中写入多行。该流以安全的方式处理重试和按序交付。数据在所有行都已发送到 BigQuery 后才会被提交。

struct Row: Encodable {

    let id: Int
    let name: String
}

try await bigQuery.batchWrite(datasetID: "my_dataset", tableID: "my_table") { stream in
    try await stream.write(rows: [
        Row(id: 1, name: "John"),
        Row(id: 2, name: "Jane"),
    ])
}

开发

运行测试

有一些集成测试需要设置服务帐户。在运行 swift test 之前,设置 GOOGLE_APPLICATION_CREDENTIALS 环境变量以指向服务帐户 JSON 文件。如果未设置,则将跳过集成测试。服务帐户需要能够执行作业,并有权访问名为 my_dataset.my_table 的数据集和表。

许可证

MIT 许可证。有关详细信息,请参阅 LICENSE

贡献

欢迎贡献!请随时提交 Pull Request。