NuoDB를 사용하여 Ruby On Rails에서 SQL 명령을 수동으로 실행하는 방법


142

NuoDB의 프로 시저에 액세스 할 수 있도록 SQL 명령을 수동으로 실행하려고합니다.

Ruby on Rails를 사용하고 있으며 다음 명령을 사용하고 있습니다.

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

"SQL 쿼리"는 모든 SQL 명령 일 수 있습니다.

예를 들어 "Feedback"이라는 테이블이 있고 명령을 실행할 때

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

요청 된 모든 데이터를 보내지 않고 "참"응답 만 반환합니다.

Rails 콘솔의 출력은 다음과 같습니다.

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

이것을 사용하여 NuoDB에서 저장 프로 시저를 호출하고 싶지만 프로 시저를 호출하면 "true"응답도 반환됩니다.

어쨌든 SQL 명령을 실행하고 "true"응답을받는 대신 요청 된 데이터를 얻을 수 있습니까?

답변:


166

사용자 지정 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을 리턴합니다.

이 방법으로 레일 애플리케이션의 어느 곳에서나 예를 들어 호출 할 수 있습니다.

records = execute_statement("select * from table")

"execute_statement"는 NuoDB 프로 시저, 함수 및 데이터베이스 뷰를 호출 할 수도 있습니다.


3
PSQL을 사용하는 경우 메모리가 누출되므로 exec_query를 사용하는 것이 좋습니다.
23inhouse

3
귀하의 질문과 답변의 코드 차이를 찾을 수 없습니다. 둘 다 사용하는 것 같습니다 ActiveRecord::Base.connection.execute. 데이터 대신 데이터를 얻기 위해 정확히 무엇을 변경했는지 지적 해 주 true시겠습니까?
RocketR

120

나에게 해시를 반환하지 못했습니다.

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

그러나 exec_query 메소드를 사용하면 효과가 있습니다.

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

10
.exec_queryActiveRecord::Result쉽게 접근 할 수 .columns있고 .rows속성 이 매우 편리한 객체를 반환 합니다. .execute일반적으로 처리하기가 더 어려우며 메모리를 많이 사용하는 해시 배열을 반환합니다. 내가 사용 적이 exec_query끝을 위해, 감사합니다.
Francio Rodrigues

9
마지막 주석에 추가하기 위해 일반적으로 결과를 해시 배열로 가져올 .entries때 사용할 .exec_query수 있습니다.
8bithero

이것은 항상 DELETE 쿼리를 실행하는 ActiveRecord 5의 결과에 대해 무의미합니까?
Tom Rossi

27

유사한 문제를 가진 다른 사람들을 돕기 위해 포럼에서 답변을 다시 게시 :

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

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

위의 코드는

  1. 데이터베이스 연결에서 임의의 SQL 실행
  2. 나중에 연결을 다시 연결 풀로 리턴

2
연결 자체 대신 연결 풀을 사용하는 이유는 무엇입니까? 어떤 장점이 있습니까? 그것에 대한 소스가 있습니까?
bonafernando

3
@bonafernando, 을 호출하지 않고 사용하는 코드 있으면 데이터베이스에서 "너무 많은 연결" 오류가 발생 하기 시작할 수 있습니다 . 참조 api.rubyonrails.org/v5.2/classes/ActiveRecord/...ActiveRecord::Base.connectionActiveRecord::Base.clear_active_connections!
은자

예, 귀하의 답변을 받기 전에 다른 "너무 많은 연결"오류가 발생하지 않은 것을 확인했습니다. 감사!
bonafernando 2016 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.