tursodatabase / libsql-client-rs

libSQL Rust client library can be used to communicate with sqld natively over HTTP protocol with native Rust interface.
MIT License
75 stars 27 forks source link

feat: add support for `Option` fields #61

Closed chrissuozzo closed 9 months ago

chrissuozzo commented 9 months ago

The proposed feature would allow nullable column values to be represented as Option fields within a user's row structure. For example, if you have this table with the nullable column optional_value:

CREATE TABLE sometable (
  id INTEGER NOT NULL,
  value, TEXT NOT NULL,
  optional_value INTEGER,
  PRIMARY KEY (id)
);

You could then represent the row as:

#[derive(Debug, serde::Deserialize)]
struct SomeTableRow {
  id: i64,
  value: String,
  optional_value: Option<i64>,
}

The following query would then work as expected:

let rows = db
     .execute("SELECT * FROM sometable")
     .await?
     .rows
     .iter()
     .map(de::from_row)
     .collect::<Result<Vec<SomeTableRow>, _>>()?;

Currently, the above query will result in a runtime error if any row has a value set in the optional_value column:

Error: invalid type: integer `1701384211`, expected option
error: process didn't exit successfully: `target\debug\test.exe` (exit code: 1)
chrissuozzo commented 9 months ago

This should do it: #62