我想在我的应用程序中将 postgresql-simple 用于我的数据库访问层,我想知道动态构建我的 sql 查询的最佳方法是什么。我想要完成的一个简单示例如下:
用户有一系列过滤器可以应用于他们正在搜索的内容:
- 宠物数量
- 宠物名称
- 宠物创建的时间
- ETC
我应该如何处理组合过滤器,这样我就不会让自己容易受到攻击。我的第一直觉是我只需要担心字符串/文本数据,因为我可以检查输入的数字实际上是一个数字,并且提供的日期实际上是一个日期。使用以下格式:
makeNumberOfPetsFragment :: String -> Either String String
makeNumberOfPetsFragment candidate =
case createStatement of
Left _ -> Left "Error creating number of pets filter"
Right x -> Right ("WHERE number_of_pets = " ++ (show x))
where createStatement = readEither candidate :: Either String Int
我不确定这是否只是一种不好的方法,或者仅使用现有库是否会更好,或者在我没有考虑的预制语句中是否有更好的方法。