首页 > 解决方案 > Rusqlite 插入多行

问题描述

如何使用 rusqlite 在单个查询中插入多行?查看下面的语法,我认为它失败了,因为查询期望 Vec 中只有一个值。

可以使用任何类型的辅助函数来完成,还是我必须完整地创建查询?

    let mut names = Vec::new();
    names.push("Mittens");
    names.push("Jingle Paws");
    names.push("Sir Fluffy");
    match conn.execute(
        "INSERT INTO cats (name) VALUES (?1)",
        names,
    ) {
        Ok(_t) => (),
        Err(e) => {
            let gil = Python::acquire_gil();
            let py = gil.python();
            let error_message = format!("Error inserting cats into database! {}", e.to_string());
            PyIOError::new_err(error_message).restore(py);
            return Err(PyErr::fetch(py));
        }
    };

?

OSError: Error inserting cats into database! Wrong number of parameters passed to query. Got 2, needed 1

标签: rustrusqlite

解决方案


我是否必须完整地创建查询?

有理由确定是这个。

据我所知,rusqlite 不提供任何类型的批处理 API,因此您有两种选择:

  • 动态创建多值查询,例如

    let placeholders = names.iter().map(|_| "(?)").collect::<Vec<_>>().join(", ");
    let q = format!("INSERT INTO cats (name) VALUES {}", placeholders);
    ... conn.execute(q, names) ...
    
  • prepare查询,然后execute在循环中(在事务中)

第一个可能是最有效的,但它也更粗糙,更不安全,更难调试。


推荐阅读