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次
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函数调用都可能失败,因此广泛使用了 Result
和 Option
。以下代码使用了常见的文档快捷方式,大量调用 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