Database.HDBC是否支持命名参数?

时间:2013-10-02 13:15:17

标签: sql haskell named-parameters hdbc

我不喜欢依赖位置参数,是否可以使用HDBC这样做?

我可以看到传递[(String, SqlValue)]而不是[SqlValue]作为this package的各种执行函数的参数。

简而言之,我宁愿

select 
  t.f1
  , t.f2
  , t.f3
from
  schema.table t
where
 t.f1 > @param1
 and t.f2 < @param2

大于

select 
  t.f1
  , t.f2
  , t.f3
from
  schema.table t
where
 t.f1 > ?
 and t.f2 < ?

1 个答案:

答案 0 :(得分:1)

不是直接使用hdbc,而是在shakespeare-text包的帮助下完成:

quickQuery cn (T.unpack
                 [st|select bar, baz, foo
                       from table1 r
                      inner join location l on r.locat_id = l.location_id
                      where r.record_id = #{pageIdxId page}
                        and foo > #{var1 + var2}
                      order by 1|]) []

注意#{}占位符中的haskell变量和表达式。

但是要注意字符串拼接。

使用字符串值的sql转义函数。

sqlEscape :: Text -> Text
sqlEscape = T.replace "'" "''" 

然后

[st|update foo set bar = '#{sqlEscape someString}' where recid = #{myRecId}|]

或者,如果您完成任务,可以使用莎士比亚文本库并对其进行一些小改动,以自动转义所有isString类型。