Database.HDBC поддерживает именованные параметры?

Мне не нравится полагаться на позиционные параметры, возможно ли это сделать с HDBC?

Я мог видеть прохождение [(String, SqlValue)] вместо [SqlValue] в качестве аргументов для различных исполняющих функций этого пакета.

В двух словах, я бы предпочел

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 ответ

Не напрямую с 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.

Другие вопросы по тегам