2016-07-23 2 views
0

데이터베이스 작업을 실험하고있었습니다. 예를 들어,이 코드가 예상되는 결과를 제공하지 않는 이유는 무엇입니까?

begin 
    db_con = PG.connect :dbname => 'sureshkumar', :user => 'sureshkumar' 
    db_con.prepare 'get_result', "SELECT * from users;" 
    users_name = db_con.exec_prepared 'get_result' 
    if users_name != nil 
     puts users_name.values 
    else 
     puts "There is no users available in the table users" 
    end 
rescue PG::Error => e 
     puts e.message 
ensure 
     db_con.close if db_con 
end 

users는 두 개의 열이 포함되어 있습니다. 그들은 테이블이 어떤 행을 포함하지 않는 경우, exec_prepared 문이 어떤 행을 반환하지 않습니다

user_id 
user_name 

이다. 이 경우 if 조건이 false가되지 않는 이유는 무엇입니까? exec_prepared 메서드가 어떤 행도 반환하지 않는지 어떻게 확인합니까?

+0

암호를 입력하여 연결 하시겠습니까? '! = nil' 부분을 생략하면'if users_name' 만 쓰면 어떻게 될까요? –

+0

데이터베이스 암호를 설정하지 않았습니다. 따라서 암호를 입력 할 필요가 없습니다. – suresh

답변

2

users_name = db_con.exec_prepared 'get_result'nil에서 users_name으로 반환하지 않습니다.

PG::Connection#exec_prepared의 설명서에 따르면 PG::Result 개체를 반환합니다. 따라서 users_name 개체는 결코 nil 일 수 없습니다. 항상 PG::Result의 인스턴스가됩니다.

따라서 쿼리 실행에서 반환 된 행이 있는지 확인하려면이 PG::Result 개체에 값이 있는지 확인해야합니다. 귀하의 경우 users_name 변수에 PG::Result이 포함되어 있습니다. 따라서 ntuples을 호출해야 쿼리에서 반환되는 행 수를 확인할 수 있습니다.

그래서 당신의 if 절과 같이 변경 :

if users_name.ntuples > 0 
    puts "There are users" 
else 
    puts "There is no users available in the table users" 
end 

PG::Result's documentation 당신이 결과를 액세스 할에 호출 할 수있는 어떤 다른 방법 알아보기.

+0

작동 중입니다. 고맙습니다! – suresh

관련 문제