ZetCode

Doing SQL queries with Ruby in SQLite

last modified July 6, 2020

We have already established a connection to the database. Now we are going modify and fetch the data from the database.

Data is retrieved from the database with the SELECT statement. In SQLite Ruby module, first we prepare the SQL statement with the prepare method. The SQL string is sent to the database engine, which checks the statement validity, syntax and in some databases also the user permissions to perform certain queries. If all is OK, a statement object is returned to the Ruby script. The next step is the call to the execute method. The method executes the query within the database. The data is retrieved.

The Ruby SQLite module has several methods to fetch data from database tables. After the SQL statement was prepared and executed, we can go through the returned data.

Fetching data

In the first example we fetch one row from the Cars table.

#!/usr/bin/ruby

require 'sqlite3'

begin
    
    db = SQLite3::Database.new "test.db"
    
    id = 1
    
    stm = db.prepare "SELECT * FROM Cars WHERE Id=?"
    stm.bind_param 1, id
    rs = stm.execute
    
    row = rs.next
    
    puts row.join "\s"
    
rescue SQLite3::Exception => e 
    
    puts "Exception occurred"
    puts e
    
ensure
    stm.close if stm
    db.close if db
end

In the example we do all the steps to get the first row from the Cars table.

stm = db.prepare "SELECT * FROM Cars WHERE Id=?"

The SELECT statement is prepared with the prepare method. A statement object is returned.

stm.bind_param 1, id

A parameter is bound to the placeholder in the statement.

rs = stm.execute

The statement is executed. A ResultSet object is returned.

row = rs.next

We obtain the next row from the result set. Since we want to fetch only one row, we call the next method once.

puts row.join "\s"

The row is a Ruby array. The three fields are joined with a space character to form a line using the join method.

$ ./fetch.rb
1 Audi 52642

This is the output of the example.

In the following example, we will fetch five rows. We put the next method in a while loop.

#!/usr/bin/ruby

require 'sqlite3'

begin
    
    db = SQLite3::Database.open "test.db"
        
    stm = db.prepare "SELECT * FROM Cars LIMIT 5"
    rs = stm.execute
    
    while (row = rs.next) do
        puts row.join "\s"
    end
        
    
rescue SQLite3::Exception => e 
    
    puts "Exception occurred"
    puts e
    
ensure
    stm.close if stm
    db.close if db
end

In this script we connect to the database and fetch 5 rows of the Cars table.

stm = db.prepare "SELECT * FROM Cars LIMIT 5"

This is the SQL statement for fetching 5 rows.

while (row = rs.next) do
    puts row.join "\s"
end

The next method is put inside the while loop. It returns the next row from the result set. If no more rows are left, the method returns nil and the while loop is terminated.

We can get data from the result set using the each method.

#!/usr/bin/ruby

require 'sqlite3'

begin
    
    db = SQLite3::Database.open "test.db"
        
    stm = db.prepare "SELECT * FROM Cars LIMIT 5"
    rs = stm.execute
    
    rs.each do |row|
        puts row.join "\s"
    end
            
rescue SQLite3::Exception => e 
    
    puts "Exception occurred"
    puts e
    
ensure
    stm.close if stm
    db.close if db
end

Again we select five rows from the Cars table.

rs.each do |row|
    puts row.join "\s"
end

We use the each method to iterate over the result set.

The next example shows the database object's execute method. It is a convenience method that saves a few keystrokes.

#!/usr/bin/ruby

require 'sqlite3'

begin
    
    db = SQLite3::Database.open "test.db"
        
    rows = db.execute "SELECT * FROM Cars LIMIT 5"
        
    for row in rows do
        puts row.join "\s"
    end
            
rescue SQLite3::Exception => e 
    
    puts "Exception occurred"
    puts e
    
ensure
    db.close if db
end

The example selects and prints five rows from the Cars table.

rows = db.execute "SELECT * FROM Cars LIMIT 5"

Here we do two jobs in one step. We prepare the statement and execute it. The method returns the data in a Ruby array.

for row in rows do
    puts row.join "\s"
end

We print the data from the Ruby array.

So far we have seen data returned in the form of a ResultSet or an array. The next example will return the data in the form of an array of hashes. This way we can identify field values by their column names.

#!/usr/bin/ruby

require 'sqlite3'

begin
    
    db = SQLite3::Database.open "test.db"
    db.results_as_hash = true
        
    ary = db.execute "SELECT * FROM Cars LIMIT 5"    
        
    ary.each do |row|
        printf "%s %s %s\n", row['Id'], row['Name'], row['Price']
    end
             
rescue SQLite3::Exception => e 
    
    puts "Exception occurred"
    puts e
    
ensure
    db.close if db
end

In the example we get fields by their column names.

db.results_as_hash = true

We set the results_as_hash property to true. All rows will be returned as Hash objects, with the column names as the keys.

ary.each do |row|
    printf "%s %s %s\n", row['Id'], row['Name'], row['Price']
end

We get the fields by their column names.

$ ./fetch_hash.rb
1 Audi 52642
2 Mercedes 57127
3 Skoda 9000
4 Volvo 29000
5 Bentley 350000

We see the output of the example.

Fetching a row or a value

Ruby SQLite module has two convenience methods for retrieving a row or a value. In the first example, we will get a single row from a table.

#!/usr/bin/ruby

require 'sqlite3'

begin
    
    db = SQLite3::Database.open "test.db"
      
    row = db.get_first_row "SELECT * FROM Cars WHERE Id=1"       
    puts row.join "\s"
    
rescue SQLite3::Exception => e 
    
    puts "Exception occurred"
    puts e
    
ensure
    db.close if db
end

We get the data for the first row of the Cars table.

row = db.get_first_row "SELECT * FROM Cars WHERE Id=1" 

The get_first_row method gets the first row and discards all other rows.

puts row.join "\s"

The row is printed to the console.

$ ./fetchrow.rb
1 Audi 52642

Here we see the output of the fetchrow.rb example.

In the last example, we select a single value.

#!/usr/bin/ruby

require 'sqlite3'

begin
    
    db = SQLite3::Database.open "test.db"
      
    val = db.get_first_value "SELECT Price FROM Cars WHERE Name='Bentley'"       
    puts val
    
rescue SQLite3::Exception => e 
    
    puts "Exception occurred"
    puts e
    
ensure
    db.close if db
end

We select a price for a specific car.

val = db.get_first_value "SELECT Price FROM Cars WHERE Name='Bentley'"      

With the get_first_value method we select a specific field of a row. In our case it is the price of the Bentley car.

$ ./fetchvalue.rb
350000    

This is the output.

In this part of the SQLite Ruby tutorial, we have demonstrated how to fetch data from the database using various methods.