Zum Inhalt springen

Rust-Client

Installation Um den DuckDB-Rust-Client zu verwenden, besuchen Sie die Rust-Installationsseite.

Die aktuelle stabile Version des DuckDB-Rust-Clients ist 1.5.5.

Installation

Der DuckDB-Rust-Client kann von crates.io installiert werden. Details finden Sie auf docs.rs.

Grundlegende API-Nutzung

duckdb-rs ist ein ergonomischer Wrapper auf Basis der DuckDB-C-API. Details finden Sie in der README.

Start und Beenden

Um duckdb zu verwenden, müssen Sie zuerst ein Handle Connection mit Connection::open() initialisieren. Connection::open() nimmt als Parameter die Datenbankdatei entgegen, aus der gelesen und in die geschrieben werden soll. Wenn die Datenbankdatei nicht existiert, wird sie erstellt (die Dateierweiterung kann .db, .duckdb oder etwas anderes sein). Sie können auch Connection::open_in_memory() verwenden, um eine In-Memory-Datenbank zu erzeugen. Beachten Sie, dass bei einer In-Memory-Datenbank keine Daten auf die Festplatte geschrieben werden (d. h. alle Daten gehen verloren, wenn Sie den Prozess beenden).

use duckdb::{params, Connection, Result};
let conn = Connection::open_in_memory()?;

Die Connection schließt die zugrunde liegende Datenbankverbindung automatisch, wenn sie außer Scope geht (über Drop). Sie können die Connection auch explizit mit conn.close() schließen. Im typischen Fall gibt es dazwischen keinen großen Unterschied, aber wenn ein Fehler auftritt, haben Sie beim expliziten Schließen die Möglichkeit, ihn zu behandeln.

Abfragen

SQL-Abfragen können mit der Methode execute() von Verbindungen an DuckDB gesendet werden, oder wir können die Anweisung zuerst vorbereiten und dann darauf abfragen.

#[derive(Debug)]
struct Person {
id: i32,
name: String,
data: Option<Vec<u8>>,
}
conn.execute(
"INSERT INTO person (name, data) VALUES (?, ?)",
params![me.name, me.data],
)?;
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 {
println!("Found person {:?}", person.unwrap());
}

Appender

Der Rust-Client unterstützt die DuckDB-Appender-API für Masseneinfügungen. Zum Beispiel:

fn insert_rows(conn: &Connection) -> Result<()> {
let mut app = conn.appender("foo")?;
app.append_rows([[1, 2], [3, 4], [5, 6], [7, 8], [9, 10]])?;
Ok(())
}