Как выполнить команды SQL вручную в Ruby On Rails с помощью NuoDB

Я пытаюсь выполнить команды SQL вручную, чтобы я мог обращаться к процедурам в NuoDB.

Я использую Ruby on Rails, и я использую следующую команду:

ActiveRecord::Base.connection.execute("SQL query")

"SQL-запрос" может быть любой командой SQL.

Как, например, у меня есть таблица под названием "Обратная связь", и когда я выполняю команду:

ActiveRecord::Base.connection.execute("SELECT `feedbacks`.* FROM `feedbacks`")

Это приведет только к возврату "истинного" ответа вместо отправки мне всех запрошенных данных.

Это вывод в консоли Rails:

SQL (0.4ms)  SELECT `feedbacks`.* FROM `feedbacks`
 => true

Я хотел бы использовать это для вызова хранимых процедур в NuoDB, но после вызова процедур это также вернет "истинный" ответ.

В любом случае я могу выполнять команды SQL и получать запрошенные данные вместо получения "истинного" ответа?

Ответ 1

Рабочая команда, которую я использую для выполнения пользовательских операторов SQL:

results = ActiveRecord::Base.connection.execute("foo")

с "foo" является оператором sql (то есть "SELECT * FROM table").

Эта команда вернет набор значений в виде хэша и поместит их в переменную результатов.

Итак, на моих рельсах application_controller.rb я добавил это:

def execute_statement(sql)
  results = ActiveRecord::Base.connection.execute(sql)

  if results.present?
    return results
  else
    return nil
  end
end

Использование execute_statement вернет найденные записи и, если их нет, вернет nil.

Таким образом, я могу просто вызвать его в любом месте приложения rails, например:

records = execute_statement("select * from table")

"execute_statement" также может вызывать процедуры, функции, а также представления базы данных NuoDB.

Ответ 2

Для меня я не мог заставить это возвращать хэш.

results = ActiveRecord::Base.connection.execute(sql)

Но сработал метод exec_query.

results = ActiveRecord::Base.connection.exec_query(sql)

Ответ 3

Отправляя ответ с нашего форума, чтобы помочь другим с аналогичной проблемой:

@connection = ActiveRecord::Base.connection
result = @connection.exec_query('select tablename from system.tables')
result.each do |row|
puts row
end

Ответ 4

res = ActiveRecord::Base.connection_pool.with_connection { |con| con.exec_query( "SELECT 1;" ) }

Приведенный выше код является примером для

  • выполнение произвольного SQL в вашей базе данных
  • возвращает соединение обратно в пул соединений