使用Ruby的ActiveRecord或Sequel,您可以逐步构建SQL查询,根据运行时的条件向查询添加where
或join
或order
子句。
以下是一个简单的示例,取自ASCIIcasts:
def index
@articles = Article.order('name')
if params[:hidden]
@articles = @articles.where(:hidden =>(params[:hidden] == "1"))
end
respond_to do |format|
format.html # index.html.erb
format.xml { render :xml => @articles }
end
end
该示例显示如果名为articles
的HTTP请求查询参数等于hidden
,如何将WHERE子句附加到1
表上的基础SQL查询。
我一直在Haskell中看HDBC和postgresql-simple。似乎postgresql-simple故意使得从动态连接的部分构建SQL查询变得困难,以防止SQL注入。 HDBC似乎足够灵活,可以根据运行时的条件构建不同结构的SQL查询,但它似乎没有提供ActiveRecord或Sequel提供的抽象级别。
有人能建议使用其中一个Haskell数据库模拟ActiveRecord的动态查询构建工具吗?
如果HDBC是要走的路,我很好。但是会有一个例子。
我想我正在寻找的是能够针对PostgreSQL后端动态编写查询。
答案 0 :(得分:7)
你可能需要Persistent,你可能需要HaskellDB,你可能想要像Esqueleto这样的东西。
以下是对各方权衡的良好讨论: http://blog.felipe.lessa.nom.br/?p=68
答案 1 :(得分:4)
您可能会发现http://hackage.haskell.org/package/esqueleto对此应用程序感兴趣。