Execute a SQL query and return results as JSON values
(&self, sql: &str)
| 79 | |
| 80 | /// Execute a SQL query and return results as JSON values |
| 81 | pub fn query(&self, sql: &str) -> Result<Vec<Value>> { |
| 82 | let mut stmt = self.conn.prepare(sql)?; |
| 83 | let column_names: Vec<String> = stmt |
| 84 | .column_names() |
| 85 | .into_iter() |
| 86 | .map(|s| s.to_string()) |
| 87 | .collect(); |
| 88 | |
| 89 | let rows = stmt.query_map([], |row| { |
| 90 | let mut obj = serde_json::Map::new(); |
| 91 | for (i, name) in column_names.iter().enumerate() { |
| 92 | // Try different types in order |
| 93 | let value: Value = if let Ok(v) = row.get::<_, i64>(i) { |
| 94 | Value::Number(v.into()) |
| 95 | } else if let Ok(v) = row.get::<_, f64>(i) { |
| 96 | serde_json::Number::from_f64(v) |
| 97 | .map(Value::Number) |
| 98 | .unwrap_or(Value::Null) |
| 99 | } else if let Ok(v) = row.get::<_, String>(i) { |
| 100 | Value::String(v) |
| 101 | } else { |
| 102 | Value::Null |
| 103 | }; |
| 104 | obj.insert(name.clone(), value); |
| 105 | } |
| 106 | Ok(Value::Object(obj)) |
| 107 | })?; |
| 108 | |
| 109 | let results: Vec<Value> = rows.filter_map(|r| r.ok()).collect(); |
| 110 | Ok(results) |
| 111 | } |
| 112 | |
| 113 | // --- Table loaders --- |
| 114 |
no outgoing calls