OracleNIO

Supported Swift Versions Supported Platforms SSWG Sandbox Incubating Badge Documentation Apache 2.0 License codecov CI 23ai CI 21c CI ADB

非阻塞、事件驱动的 Swift 客户端,用于 Oracle 数据库,构建于 SwiftNIO 之上。

它就像 PostgresNIO,但是是为 Oracle 数据库编写的。

特性

支持的 Oracle 数据库版本

Oracle 数据库 12.1 或更高版本。

连接方法

请注意,所有基于令牌的身份验证方法目前都未经测试,因为我 (@lovetodream) 没有基础设施来测试它。欢迎贡献!

所有连接都可以使用 OracleConnection.Configuration.TLS 进行 TLS 加密。

API 文档

查看 OracleNIO API 文档,详细了解所有类、结构体、协议等。

入门指南

添加依赖项

OracleNIO 作为依赖项添加到您的 Package.swift

    dependencies: [
        .package(url: "https://github.com/lovetodream/oracle-nio.git", from: "1.0.0-alpha"),
        ...
    ]

OracleNIO 添加到您想要使用它的目标中

    targets: [
        .target(name: "MyFancyTarget", dependencies: [
            .product(name: "OracleNIO", package: "oracle-nio"),
        ])
    ]

创建连接

要创建连接,首先创建一个连接配置对象

import OracleNIO

let config = OracleConnection.Configuration(
    host: "127.0.0.1", 
    port: 1521,
    service: .serviceName("my_service"), // or .sid("sid")
    username: "my_username",
    password: "my_password"
)

要创建连接,我们需要一个 Logger,用于记录连接后台事件。

import Logging

let logger = Logger(label: "oracle-logger")

现在我们可以将它们放在一起

import OracleNIO
import Logging

let logger = Logger(label: "oracle-logger")

let config = OracleConnection.Configuration(
    host: "127.0.0.1", 
    port: 1521,
    service: .serviceName("my_service"),
    username: "my_username",
    password: "my_password"
)

let connection = try await OracleConnection.connect(
  configuration: config,
  id: 1,
  logger: logger
)

// Close your connection once done
try await connection.close()

运行 SQL 语句

一旦建立连接,就可以将语句发送到服务器。这非常简单

let rows = try await connection.execute("SELECT id, username, birthday FROM users", logger: logger)

execute(_:options:logger:file:line:) 可以运行 QueryDMLDDL 甚至 PlSQL

该语句将返回一个 OracleRowSequence,它是 OracleRowAsyncSequence。这些行可以逐个迭代

for try await row in rows {
  // do something with the row
}

从 OracleRow 解码

但是,在大多数情况下,将行的字段请求为一组 Swift 类型要容易得多

for try await (id, username, birthday) in rows.decode((Int, String, Date).self) {
  // do something with the datatypes.
}

类型必须实现 OracleDecodable 协议才能从行中解码。OracleNIO 为大多数 Swift 内置类型以及 Foundation 提供的一些类型提供了默认实现

OracleNIO 也提供了一些更特定于 Oracle 的类型。

带参数的语句

也支持将参数化查询发送到数据库(以最酷的方式)

let id = 1
let username = "fancyuser"
let birthday = Date()
try await connection.execute("""
  INSERT INTO users (id, username, birthday) VALUES (\(id), \(username), \(birthday))
  """, 
  logger: logger
)

虽然乍一看这看起来像是 SQL 注入 😱 的经典案例,但 OracleNIO 的 API 确保了这种用法是安全的。execute(_:options:logger:file:line:) 方法的第一个参数不是普通的 String,而是 OracleStatement,它实现了 Swift 的 ExpressibleByStringInterpolation 协议。OracleNIO 使用提供的字符串的字面部分作为 SQL 语句,并将每个插值替换为参数绑定。只有实现 OracleEncodable 协议的值才能以这种方式进行插值。与 OracleDecodable 一样,OracleNIO 为大多数常见类型提供了默认实现。

某些查询不会从服务器接收任何行(最常见的是 INSERTUPDATEDELETE 查询,更不用说大多数 DDL 查询)。为了支持这一点,execute(_:options:logger:file:line:) 方法被标记为 @discardableResult,这样如果未使用返回值,编译器就不会发出警告。

更新日志

SemVer 更改记录在 发布页面 上的每个版本中。

Swift 服务器生态系统

Oracle NIOSwift on Server Working Group 生态系统的一部分 - 目前被推荐为 沙箱成熟度

提案 推介 审核 投票
SSWG-0028 2023-12-20 2024-01-17 2024-04-07

语言和平台支持

在给定平台上,任何给定的 Oracle NIO 版本都将至少支持最新版本的 Swift 以及发布时之前的 1 个版本。

主要版本发布将围绕官方 Swift 版本发布进行安排,从 Swift 版本发布起不超过 3 个月

主要版本发布将不再支持任何早于最后 2 个 Swift 版本的 Swift 版本。

此策略旨在平衡对尽可能多的向后兼容性的渴望,同时也能利用新的 Swift 功能来实现最佳的 API 设计。

许可证

Apache 2.0

版权所有 (c) 2023-至今,Timo Zacherl (@lovetodream)

本项目包含由与本项目无关的其他人编写的代码。所有版权声明均由他们保留。有关完整列表及其声明的权利,请参阅 NOTICE.txt

OracleOracle Corporation 的注册商标。对其商标的任何使用均符合已建立的 商标指南,并不暗示与他们的任何关联或认可,所有权利均由他们保留。

SwiftApple, Inc 的注册商标。对其商标的任何使用均不暗示与他们的任何关联或认可,所有权利均由他们保留。