#数据库访问 #连接数据库 #数据库驱动 #ODBC #高级 #ORM

odbc-iter

基于 'odbc' 包的高级数据库访问库,使用原生 ODBC 驱动程序访问各种数据库

10 个版本

0.2.7 2023年2月12日
0.2.6 2020年8月7日
0.2.5 2020年2月12日
0.2.4 2020年1月23日
0.1.1 2019年7月24日

#755数据库接口

Download history 25/week @ 2024-04-04 17/week @ 2024-04-11 2/week @ 2024-05-16 1/week @ 2024-05-23 1/week @ 2024-06-06 3/week @ 2024-06-13 3/week @ 2024-06-20

518 每月下载量
用于 3 个包

MIT 许可证

195KB
4.5K SLoC

Latest Version Documentation License

odbc-iter 是一个基于 odbc 包的 Rust 高级数据库访问库,使用原生 ODBC 驱动程序访问各种数据库。

使用此库,您可以

  • 连接到支持 ODBC 标准的任何数据库(例如,通过 unixodbc 库和 ODBC 数据库驱动程序),
  • 运行一次性、预编译或参数化查询,
  • 通过标准的 Iterator 接口迭代结果集,
  • 自动将行转换为
    • Rust 标准类型的元组,
    • 实现特质的自定义类型,
    • 动态类型值的向量,
  • 为多线程应用程序创建线程局部连接。

尚需补充的内容

  • 对二进制编码的数值类型(十进制数)的全面支持 - 当前的 Decimal 实现依赖于解析值的字符串表示(可以通过 rust_decimal 功能启用)。
  • 此列表的其余部分 - 请在 GitHub 问题跟踪器中打开问题,以报告缺失的功能、错误等。

示例用法

连接并运行具有行类型转换的一次性查询

use odbc_iter::{Odbc, ValueRow};

// Connect to database using connection string
let connection_string = std::env::var("DB_CONNECTION_STRING")
    .expect("DB_CONNECTION_STRING environment not set");
let mut connection = Odbc::connect(&connection_string)
    .expect("failed to connect to database");

// Handle statically guards access to connection and provides query functionality
let mut db = connection.handle();

// Get single row single column value
println!("{}", db.query::<String>("SELECT 'hello world'").expect("failed to run query")
    .single().expect("failed to fetch row"));

// Iterate rows with single column
for row in db.query::<String>("SELECT 'hello world' UNION SELECT 'foo bar'")
    .expect("failed to run query") {
    println!("{}", row.expect("failed to fetch row"))
}
// Prints:
// hello world
// foo bar

// Iterate rows with multiple columns
for row in db.query::<(String, i8)>(
    "SELECT 'hello world', CAST(24 AS TINYINT) UNION SELECT 'foo bar', CAST(32 AS TINYINT)")
    .expect("failed to run query") {
    let (string, number) = row.expect("failed to fetch row");
    println!("{} {}", string, number);
}
// Prints:
// hello world 24
// foo bar 32

// Iterate rows with dynamically typed values using `ValueRow` type that can represent
// any row
for row in db.query::<ValueRow>("SELECT 'hello world', 24 UNION SELECT 'foo bar', 32")
    .expect("failed to run query") {
    println!("{:?}", row.expect("failed to fetch row"))
}
// Prints:
// [Some(String("hello world")), Some(Tinyint(24))]
// [Some(String("foo bar")), Some(Tinyint(32))]

依赖项

~3.5–5MB
~86K SLoC