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.