rust Rusqlite:安全地插入多行

bz4sfanl  于 2023-10-20  发布在  SQLite
关注(0)|答案(2)|浏览(185)

我想使用Rusqlite将多行插入到sqlite数据库中。这些值可以包含单引号字符。
只要没有值包含单引号字符,这种插入多行的简单方法就可以工作:

insert into table (field1, field2, field3) 
values ('Value a1', 'Value a2', 'Value a3'), 
       ('Value b1', 'Value b2', 'Value b3')

但是只要一个值包含一个单引号,插入就会失败(当然)。
当插入单行时,您可以安全地这样做:

let sSQL: String  = format!("insert into table(field1, field2, field3) values(?1, ?2, ?3)");
let mut stmt = conn.prepare (&sSQL)?;

stmt.execute([&sValue1, &sValue2, &sValue3]);

我的问题是:安全地插入多行(其中也可能包含单引号)的最佳方法是什么?

e3bfsja2

e3bfsja21#

正如Connection::prepare文档中的示例所述,您只需多次调用Statement::execute即可实现所需的效果:

let sSQL: String  = format!("insert into table(field1, field2, field3) values(?1, ?2, ?3)");
let mut stmt = conn.prepare (&sSQL)?;

stmt.execute([&sValue11, &sValue12, &sValue13])?;
stmt.execute([&sValue21, &sValue22, &sValue23])?;

(Also,别忘了处理execute调用的Result s!)

ou6hu8tu

ou6hu8tu2#

我的问题是:安全地插入多行(其中也可能包含单引号)的最佳方法是什么?
如果你知道你总是需要插入2行,你可以扩展现有的版本:

let sSQL = "insert into table(field1, field2, field3) values (?1, ?2, ?3), (?4, ?5, ?6)";
let mut stmt = conn.prepare (&sSQL)?;

stmt.execute((&v1, &v2, &v3, &v4, &v5, &v6));

否则,就像FZs指出的那样,您可以多次execute一个预准备语句。事实上,这正是使用预处理语句的关键所在,否则您可以使用Connection::execute
只要没有值包含单引号字符,这种插入多行的简单方法就可以工作:
请注意,如果查询不是静态字符串,则通常应将其视为断开。即使你认为你知道你注入的所有动态数据都是安全的,这也是一个不必要的风险。
当插入单行时,您可以安全地这样做:
请注意,对占位符进行编号不是必需的,?也可以正常工作,就像它们按顺序编号一样。显式编号的主要优点是:

  • 跟踪具有许多参数的大型查询。
  • 多次使用相同的参数。
  • 如果出于某种原因,您需要更改查询中参数的顺序,而无法更改参数本身的顺序。

但在这些情况下(可能除了最后一种情况),您可能希望使用named parameters
我还建议在所有情况下使用参数的 tuple,但发送单个参数:数组或切片不允许不同的参数类型,因此最好始终使用元组。

相关问题