2016-07-23 114 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

相关问题