我有以下几点
case class Request(name:Option[String], age: Option[Int], address: Option[List[String]])我想要构造这样的查询,条件应该在定义字段的情况下才适用:
val req = Request(Some("abc"), Some(27), Some(List["add1", "add2"])
select name, age, email from user where name = "abc" AND age = 27 AND address in("add1", "add2");我浏览了一些doobies文档,并发现了一些片段,这些片段允许我执行以下操作。
val baseSql: Fragment = sql"select name, age, email from user";
val nameFilter: Option[Fragment] = name.map(x => fr" name = $x")
val ageFilter: Option[Fragment] = age.map(x => fr" age = $x")
val addressFilter: Option[Fragment] = address.map(x => fr " address IN ( " ++ x.map(y => fr "$y").intercalate(fr",") ++ fr" )"
val q = baseSql ++ whereAndOpt(nameFilter, ageFilter, addressFilter)根据我的理解,如果定义了所有字段,则查询应该如下所示:
select name, age, email from user where name = "abc" AND age = 27 AND address in("add1","add2");但是,查询如下:
select name, age, email from user where name = ? AND age = ? AND address in(?);这里有什么问题我找不到。
提前谢谢!
发布于 2022-06-29 20:59:01
百事大吉。
Doobie通过在查询( ? )中使用?的SQL功能来防止SQL注入,然后将数据库应该放置的值传递到连续的?参数中。
就像这样想:如果有人发布了name = "''; DROP table users; SELECT 1"。那你就会以
select name, age, email from user where name = ''; DROP table users; SELECT 1这可能是个问题。
由于数据库正在为您插入参数,所以它可以在对原始文本进行解析之后(当这种注入是不可能的)之后进行。这一功能不仅被Doobie使用,而且几乎每一个现代库或框架都使用,这些库或框架允许您在比普通驱动程序更高的级别上与数据库对话。
所以,您看到的是一个参数化的查询,它将以数据库的方式查看,只是看不到传递给它的参数。
https://stackoverflow.com/questions/72807373
复制相似问题