为什么这段代码没有给出预期的输出?

时间:2016-07-23 09:26:41

标签: ruby-on-rails ruby database

我正在尝试数据库操作。例如,

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方法是否不返回任何行?

1 个答案:

答案 0 :(得分: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,了解您可以调用其他方法来访问结果。