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.