55 lines
1.3 KiB
Rust
55 lines
1.3 KiB
Rust
use duckdb::{params, Connection, Result};
|
|
|
|
use duckdb::arrow::record_batch::RecordBatch;
|
|
use duckdb::arrow::util::pretty::print_batches;
|
|
|
|
#[derive(Debug)]
|
|
struct Person {
|
|
id: i32,
|
|
name: String,
|
|
data: Option<Vec<u8>>,
|
|
}
|
|
|
|
fn main() -> Result<()> {
|
|
let conn = Connection::open_in_memory()?;
|
|
|
|
conn.execute_batch(
|
|
r"CREATE SEQUENCE seq;
|
|
CREATE TABLE person (
|
|
id INTEGER PRIMARY KEY DEFAULT NEXTVAL('seq'),
|
|
name TEXT NOT NULL,
|
|
data BLOB
|
|
);
|
|
")?;
|
|
|
|
let me = Person {
|
|
id: 0,
|
|
name: "Steven".to_string(),
|
|
data: None,
|
|
};
|
|
conn.execute(
|
|
"INSERT INTO person (name, data) VALUES (?, ?)",
|
|
params![me.name, me.data],
|
|
)?;
|
|
|
|
// query table by rows
|
|
let mut stmt = conn.prepare("SELECT id, name, data FROM person")?;
|
|
let person_iter = stmt.query_map([], |row| {
|
|
Ok(Person {
|
|
id: row.get(0)?,
|
|
name: row.get(1)?,
|
|
data: row.get(2)?,
|
|
})
|
|
})?;
|
|
|
|
for person in person_iter {
|
|
let p = person.unwrap();
|
|
println!("ID: {}", p.id);
|
|
println!("Found person {:?}", p);
|
|
}
|
|
|
|
// query table by arrow
|
|
let rbs: Vec<RecordBatch> = stmt.query_arrow([])?.collect();
|
|
print_batches(&rbs).unwrap();
|
|
Ok(())
|
|
} |