Как вручную выполнить команды 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 и получить запрошенные данные вместо получения "истинного" ответа?

5 ответов

Решение

Рабочая команда, которую я использую для выполнения пользовательских операторов 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.

Для меня я не мог получить это, чтобы вернуть хэш.

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

Но использование метода exec_query сработало.

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

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

@connection = ActiveRecord::Base.connection
result = @connection.exec_query('select tablename from system.tables')
result.each do |row|
puts row
end
res = ActiveRecord::Base.connection_pool.with_connection { |con| con.exec_query( "SELECT 1;" ) }

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

  1. выполнение произвольного SQL на вашем соединении с базой данных
  2. возвращение соединения обратно в пул соединений после

Как только вы получите объект MySql::Result

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

Вы можете преобразовать его в массив строк

      results.to_a

сделает массив этого формата

      [[row1][row2]...]
Другие вопросы по тегам