2016-07-23 88 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只包含兩列。他們是,

user_id 
user_name 

如果表不包含任何行,則exec_prepared語句不返回任何行。在這種情況下,爲什麼if條件不成爲假?如何檢查exec_prepared方法是否不返回任何行?

+0

你不需要密碼來連接嗎?如果你簡單地寫'if user_name',忽略'!= nil'部分會發生什麼? –

+0

我沒有設置數據庫的密碼。所以,我不需要密碼來連接。 – suresh

回答

2

users_name = db_con.exec_prepared 'get_result'永遠不會返回nilusers_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

相關問題