rust - Rust rusqlite 无法插入行
问题描述
以下代码无法编译:
55 | (":dataset_id", &dataset_id),
| ^^^^^^^^^^^ expected `u32`, found `i32`
pub fn save(&mut self, annotations: Vec<Record>, dataset_id: i32) -> Result<(), Error> {
let mut tx = self.conn.transaction()?;
for record in records {
let json: String = record();
let sql: &str =
"INSERT INTO records (record_id, dataset_id, value)
VALUES (:record_id, :dataset_id, :value)";
let mut statement = tx.prepare(sql)?;
statement.execute(&[
(":record_id", &record.id),
(":dataset_id", &dataset_id),
(":value", "hello world")]);
};
tx.commit()?;
Ok(())
}
如果我从我的 SQL 语句中删除 dataset_id 并注释掉该行:(":dataset_id", &dataset_id),
然后它无法编译:
56 | (":value", &"hello".to_string()),
| ^^^^^^^^^^^^^^^^^^^^ expected `u32`, found struct `std::string::String`
解决方案
的参数execute
是 a P: Params
,即“实现的任何类型Params
”。Rust 编译器不会猜测您想要的特定类型,然后相应地处理参数。相反,它只会自行解析参数的类型,然后查看它是否实现了Params
.
这是你的论点:
&[(":record_id", &record.id),
(":dataset_id", &dataset_id),
(":value", "hello world")]
就其本身而言,类型是什么?它是对包含三个元组的数组文字的引用: a (&str, &u32)
、 a(&str, &i32)
和 a (&str, &str)
。
由于缺乏任何进一步的信息,编译器猜测第一个元素是规范元素,因此尝试相应地转换其他元素。因此,您会收到“无法转换&i32
为&u32
”错误。
但是,您需要的是一(&str, &dyn ToSql)
组元组。
所以你可以做两件事之一。
首先,将第一个参数值显式转换为正确的类型:
&[(":record_id", &record.id as &dyn ToSql),
(":dataset_id", &dataset_id),
(":value", "hello world")]
或者第二,使用提供的named_params!
宏,rusqlite
可以说更漂亮:
statement.execute(named_params!{
":record_id": record.id,
":dataset_id": dataset_id,
":value": "hello world",
});
推荐阅读
- snakemake - 获取从蛇文件中的命令行给出的实际 --cores [N]、--jobs [N]、-j [N] 值
- linux - 在目标中构建库以在主机中进行交叉编译
- outlook - 移动到 Exchange 中的文件夹时将电子邮件标记为未读
- java - 使用 jmsTemplate (Spring JMS) 重复调度消息以传递 ActiveMQ
- mysql - SQL Check(汽车租赁)
- r - 使用 r 获取列名并在数据框中的未列出列中分配值
- vue.js - 如何从 vue.config.json 中的外部 config.json 文件设置代理 URL
- vaadin - Vaadin RichTextArea 高度自动调整
- r - 使用在 ArcGIS 中计算的 PCA 在 R 中创建 PCA 图
- r - 使用 R 遍历 URL 层并抓取数据