我想使用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]);
我的问题是:安全地插入多行(其中也可能包含单引号)的最佳方法是什么?
2条答案
按热度按时间e3bfsja21#
正如
Connection::prepare
文档中的示例所述,您只需多次调用Statement::execute
即可实现所需的效果:(Also,别忘了处理
execute
调用的Result
s!)ou6hu8tu2#
我的问题是:安全地插入多行(其中也可能包含单引号)的最佳方法是什么?
如果你知道你总是需要插入2行,你可以扩展现有的版本:
否则,就像FZs指出的那样,您可以多次
execute
一个预准备语句。事实上,这正是使用预处理语句的关键所在,否则您可以使用Connection::execute
。只要没有值包含单引号字符,这种插入多行的简单方法就可以工作:
请注意,如果查询不是静态字符串,则通常应将其视为断开。即使你认为你知道你注入的所有动态数据都是安全的,这也是一个不必要的风险。
当插入单行时,您可以安全地这样做:
请注意,对占位符进行编号不是必需的,
?
也可以正常工作,就像它们按顺序编号一样。显式编号的主要优点是:但在这些情况下(可能除了最后一种情况),您可能希望使用named parameters。
我还建议在所有情况下使用参数的 tuple,但发送单个参数:数组或切片不允许不同的参数类型,因此最好始终使用元组。