2016-07-23 8 views
0

Ich habe mit Datenbankoperationen experimentiert. Zum BeispielWarum gibt dieser Code nicht die erwartete Ausgabe?

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 

Die Tabelle users enthält nur zwei Spalten. Sie sind

user_id 
user_name 

Wenn die Tabelle keine Zeile enthält, die exec_prepared Anweisung keine Zeile zurückgibt. Warum wird die if-Bedingung in diesem Fall nicht falsch? Wie überprüfe ich, ob die Methode exec_prepared keine Zeile zurückgibt?

+0

brauchst du kein passwort zum verbinden? Was passiert, wenn Sie einfach 'if users_name' schreiben und den'! = Nil' Teil weglassen? –

+0

Ich habe das Passwort für die Datenbank nicht festgelegt. Also brauche ich kein Passwort zum Verbinden. – suresh

Antwort

2

users_name = db_con.exec_prepared 'get_result' wird niemals nil zu users_name zurückgeben.

Entsprechend der Dokumentation von PG::Connection#exec_prepared wird PG::Result Objekt zurückgegeben. Also, users_name Objekt kann nie nil sein. Es wird immer eine Instanz von PG::Result sein.

Um zu überprüfen, ob Sie Zeilen aus der Abfrageausführung zurückgegeben haben, müssen Sie überprüfen, ob dieses PG::Result Objekt irgendwelche Werte enthält. In Ihrem Fall enthält users_name Variable die PG::Result. Sie müssen also ntuples aufrufen, um zu sehen, wie viele Zeilen von der Abfrage zurückgegeben werden.

so ändern Sie Ihre if-Klausel zu so etwas wie:

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

Siehe PG::Result's documentation zu wissen, was andere Methoden, die Sie auf so nennen kann das Ergebnis zugreifen.

+0

Es funktioniert. Vielen Dank! – suresh

Verwandte Themen