2016-07-23 10 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は、2つの列を含んでいます。彼らは、表が任意の行が含まれていない場合は、exec_prepared文は任意の行を返さない、

user_id 
user_name 

です。この場合、なぜif条件がfalseにならないのですか?メソッドで行が返されないかどうかを確認するにはどうすればよいですか?

+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 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

関連する問題