#rusqlite https://github.com/rusqlite/rusqlite/blob/master/src/vtab/array.rs [[rusqlite]]のfeature `array`を使う。具体的には[[table valued function]]の[[rarray]]を使う。 ## crateのfeature追加 `cargo.toml`で`bundled`と一緒に指定する。 ```toml [dependencies] rusqlite = { version = "0.24.2", features = ["bundled", "array"] } ``` ## moduleの読みこみ Connectionを開いたあとに`array`モジュールを読み込む。 ```rust let conn = Connection::open(db)?; rusqlite::vtab::array::load_module(&conn)?; // <- 追加 ``` これを忘れると[[rarray]]が認識されない。 ```console Rusqlite error: no such table: rarray ``` ## [[Prepared statement]]の定義 ここでは[[named_params!]]を使うケースを想定する。[[rarray]]に`Rc<Vec<Value>>`を渡す。 ```rust use rusqlite::{named_params, types::Value}; use serde_rusqlite::from_rows; let mut stmt = conn.prepare("SELECT * from table WHERE stt.trip_id in rarray(:ids)"); let ids = Rc::new( vec![ String::from("id1"), String::from("id2"), ] .into_iter() .map(Value::from) .collect_vec(), ); let result = from_rows(stmt.query_named(named_params! { ":ids": ids })?) .collect(); ``` ポイント。 - `ToSql`は`Rc<Vec<Value>>`に対して実装されているため`Rc::new`が必要 - https://github.com/rusqlite/rusqlite/blob/master/src/vtab/array.rs#L51 - `Value`は`&str`または`&str`からの変換実装がないため`String`が必要 - [`impl From<&str>`は存在しない](https://docs.rs/rusqlite/0.24.2/rusqlite/types/enum.Value.html#impl-From%3CValueRef%3C%27_%3E%3E) - [`impl From<ValueRef>`はあるがEnum ValueRefに`&str`は含まれない](https://docs.rs/rusqlite/0.24.2/rusqlite/types/enum.ValueRef.html) - [`0.20.0`より前のバージョンでは`&str`が含まれていたので注意](https://docs.rs/rusqlite/0.19.0/rusqlite/types/enum.ValueRef.html) ## 関連 - https://github.com/rusqlite/rusqlite/issues/345 - https://github.com/rusqlite/rusqlite/pull/130 - https://github.com/rusqlite/rusqlite/issues/607