首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有选项字段的条件Doobie查询

带有选项字段的条件Doobie查询
EN

Stack Overflow用户
提问于 2022-06-29 20:20:05
回答 1查看 162关注 0票数 0

我有以下几点

代码语言:javascript
复制
case class Request(name:Option[String], age: Option[Int], address: Option[List[String]])

我想要构造这样的查询,条件应该在定义字段的情况下才适用:

代码语言:javascript
复制
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文档,并发现了一些片段,这些片段允许我执行以下操作。

代码语言:javascript
复制
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)

根据我的理解,如果定义了所有字段,则查询应该如下所示:

代码语言:javascript
复制
select name, age, email from user where name = "abc" AND age = 27 AND address in("add1","add2");

但是,查询如下:

代码语言:javascript
复制
select name, age, email from user where name = ? AND age = ? AND address in(?);

这里有什么问题我找不到。

提前谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-06-29 20:59:01

百事大吉。

Doobie通过在查询( ? )中使用?的SQL功能来防止SQL注入,然后将数据库应该放置的值传递到连续的?参数中。

就像这样想:如果有人发布了name = "''; DROP table users; SELECT 1"。那你就会以

代码语言:javascript
复制
select name, age, email from user where name = ''; DROP table users; SELECT 1

这可能是个问题。

由于数据库正在为您插入参数,所以它可以在对原始文本进行解析之后(当这种注入是不可能的)之后进行。这一功能不仅被Doobie使用,而且几乎每一个现代库或框架都使用,这些库或框架允许您在比普通驱动程序更高的级别上与数据库对话。

所以,您看到的是一个参数化的查询,它将以数据库的方式查看,只是看不到传递给它的参数。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72807373

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档