Как я могу использовать функцию Sequel SQL в операторе вставки?

Я хотел бы использовать функцию SQL при вставке нового значения в набор данных. Однако я продолжаю получать TypeError: can't convert Sequel::SQL::Function into String ошибки. Документы Sequel объясняют, как выбирать с помощью функций, но не вставлять.

В идеале я хотел бы избежать DB.run, так как я вставляю динамически, а необработанный SQL запутан и негибок.

Вот что я пытаюсь сделать:

INSERT INTO dataset (col1, col2, col3) VALUES ('something', 3, func(value))

Вот что у меня есть в сиквеле:

x = 'something'
y = 3
func_value = Sequel.function(:func, value)
DB[:dataset].insert (:col1 => x, :col2 => y, :col3 => func_value)

Это возможно? Если да, то что мне не хватает?


person Jillian Foley    schedule 14.03.2013    source источник
comment
Я не знаю продолжения, но я предлагаю попытаться изолировать проблему. Для меня шагом 1 будет вывод func_value, чтобы увидеть, что это такое.   -  person Dan Bracuk    schedule 14.03.2013
comment
func_value — это экземпляр Sequel::SQL::Function. Я предполагаю, что мой вопрос сводится к тому, что я могу сделать с экземпляром Sequel::SQL::Function, чтобы передать его в метод вставки Sequel.   -  person Jillian Foley    schedule 14.03.2013
comment
В итоге я использовал DB.run, чтобы получить соответствующее значение для переменной func_value, и по-прежнему использовал синтаксис DB[:dataset].insert для гибкости: DB.run("select func(#{value});") Если есть другой ответ, я бы хотел его увидеть!   -  person Jillian Foley    schedule 15.03.2013
comment
мне нужно сделать это, поскольку я пытаюсь расшифровать UUID, который я пытаюсь использовать в качестве ПК. Получил идею из этого сообщения: stackoverflow.com /вопросы/10950202/   -  person Poul    schedule 29.04.2013


Ответы (2)


Догадаться. Создайте объект Sequel::function, а затем сделайте его значением в своем хэше.

irb(main):028:0> tbl
=> #<Sequel::MySQL::Dataset: "SELECT * FROM `foo`.`bar`">
irb(main):029:0> uhex = Sequel.function(:unhex,7)
=> #<Sequel::SQL::Function @args=>[7], @f=>:unhex>
irb(main):030:0>  tbl.insert_sql( {:field_name => uhex })
=> "INSERT INTO `foo`.`bar` (`field_name`) VALUES (unhex(7))"
person Poul    schedule 29.04.2013

Похоже, есть несколько различных способов синтаксического вызова функций SQL в Sequel: http://sequel.rubyforge.org/rdoc/files/doc/dataset_filtering_rdoc.html

person PriceHardman    schedule 23.07.2013