#oracle #oci #sql #db #api-bindings

oci_rs

本软件包提供了一个对Oracle调用接口(OCI)库的Rust包装器

7个版本 (破坏性更新)

使用旧的Rust 2015

0.8.0 2018年8月21日
0.7.0 2018年3月3日
0.6.0 2018年1月23日
0.5.0 2017年9月13日
0.3.1 2017年7月19日

#1764数据库接口

每月下载 21次

MIT 许可证

140KB
2.5K SLoC

oci_rs

oci_rs提供了对Oracle调用接口 (OCI) 库的Rust包装器。Oracle网站将OCI描述为“...为定制或打包应用程序提供的全面、高性能、本地C语言接口,用于Oracle数据库...”。

文档可在此处找到。

设置

本软件包针对OCI库的12.2版本进行开发。它预计与12.x.x版本兼容,但未经过测试。需要在您的机器上安装OCI客户端库,并可从此处下载。

如果您使用Linux,那么您可能需要告诉链接器文件的位置。将以下内容添加到我的.bashrc文件中对我有效,但是细节可能因您的发行版而异。以下内容适用于OpenSuse

export LIBRARY_PATH=$LIBRARY_PATH:/usr/lib/oracle/12.2/client64/lib/

您可以使用windows-gnu工具链在Windows主机上构建此软件包。唯一的要求是oci.dll在PATH上。

windows-msvc进行了简要测试,但遇到了困难。一旦我有机会在Windows上的Visual Studio上构建此软件包,这个问题将会得到解决。

测试是在本地安装的Oracle 11g Express Edition上进行的。为了运行软件包测试,需要在本地数据库上安装用户oci_rs和密码test,并连接到localhost:1521/xe

请注意,Debian基于系统的用户在本地使用Oracle数据库时会遇到很多麻烦。由于缺乏官方包,使用Alien帮助不大。互联网上有许多复杂的说明,说明如何使其工作,但最简单的方法是在Docker容器中运行它。我已切换到Ubuntu并不得不求助于使用Docker。

为了使用 oci_rs,请将以下内容添加到您的 Cargo.toml

[dependencies]
oci_rs = "0.8.0"

并将以下内容添加到您的crate根目录

extern crate oci_rs;

示例

在以下示例中,我们将创建一个数据库连接,然后创建一个表,使用绑定变量插入几行,然后执行查询以检索它们。需要大量的错误处理。每个OCI函数调用都可能失败,因此广泛使用了 ResultOption。以下代码使用了常见的文档快捷方式,大量调用 unwrap,但在实际的客户端代码中这样做将证明是不幸的。任何远程数据库连接都是固有的不可靠的。

use oci_rs::connection::Connection;

let conn = Connection::new("localhost:1521/xe", "oci_rs", "test").unwrap();

// Create a table
let sql_create = "CREATE TABLE Toys (ToyId int,
                                     Name varchar(20),
                                     Price float)";
let mut create = conn.create_prepared_statement(sql_create).unwrap();

// Execute the create statement
create.execute().unwrap();

// Commit in case we lose connection (an abnormal disconnection would result
// in an automatic roll-back.)
create.commit().unwrap();

// Insert some values using bind variables
let sql_insert = "INSERT INTO Toys (ToyId, Name, Price)
                  VALUES (:id, :name, :price)";
let mut insert = conn.create_prepared_statement(sql_insert).unwrap();

let values = [(1, "Barbie", 23.45),
              (2, "Dinosaurs", -5.21)];

// Run through the list of values, bind them and execute the statement
for value in values.iter() {
    insert.bind(&[&value.0, &value.1, &value.2]).unwrap();
    insert.execute().unwrap()
}

insert.commit().unwrap();

// Create a query
let sql_select = "SELECT * FROM Toys
                  WHERE Name='Barbie'";

let mut select = conn.create_prepared_statement(sql_select).unwrap();

// Execute
select.execute().unwrap();

// Get the result set
let result_set = select.result_set().unwrap();
assert_eq!(result_set.len(), 1);
let first_row = &result_set[0];

// Types are automatically converted
let id: i64 = first_row[0].value().unwrap();
let name: String = first_row[1].value().unwrap();
let price: f64 = first_row[2].value().unwrap();

assert_eq!(id, 1);
assert_eq!(name, "Barbie");
assert_eq!(price, 23.45);

依赖项

约1.5MB
约21K SLoC