# Sqlite3-ruby problem accessing row values

**URL:** <https://www.ruby-forum.com/t/sqlite3-ruby-problem-accessing-row-values/141030>\
**Category:** Ruby\
**Created:** [June 20, 2008, 10:32pm UTC](https://www.ruby-forum.com/t/sqlite3-ruby-problem-accessing-row-values/141030 "2008-06-20T22:32:43Z")\
**Posts on this page:** 7\
**Page:** 1

<div class="post-metadata">

**Author:** ![infinite](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/i/ecc23a/32.png) [@infinite](https://www.ruby-forum.com/u/infinite)\
**Post date:** [June 20, 2008, 10:32pm UTC](https://www.ruby-forum.com/t/sqlite3-ruby-problem-accessing-row-values/141030/1 "2008-06-20T22:32:43Z")

</div>

I get a “can’t convert String into Integer (TypeError)” error about the  
print statement in the following code. The sqlite3-ruby library has been  
installed successfully on my OS X 10.5 system. The code executes fine if  
I replace the print statement with: print “hello”. Any suggestions? All  
I want to do is iterate through each row in the return set (rows) of the  
executed query and look at specific column values. I have run out of  
ideas on how to fix this and would appreciate any help. Thanks…

#!/usr/bin/ruby

require “sqlite3”

query = “select \* from moz\_bookmarks”  
db = SQLite3::Database.new("/Users/me/Desktop/places.sqlite")  
rows = db.execute(query)  
rows.each do |row|  
print row[‘title’]  
end

---

<div class="post-metadata">

**Author:** ![infinite](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/i/ecc23a/32.png) [@infinite](https://www.ruby-forum.com/u/infinite)\
**Post date:** [June 21, 2008, 11:18am UTC](https://www.ruby-forum.com/t/sqlite3-ruby-problem-accessing-row-values/141030/2 "2008-06-21T11:18:13Z")

</div>

2008/6/20 The D. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

> require “sqlite3”
> 
> query = “select \* from moz\_bookmarks”  
> db = SQLite3::Database.new(“/Users/me/Desktop/places.sqlite”)  
> rows = db.execute(query)

# Rows is an array of arrays…

> rows.each do |row|

# At this point, “row” is a straightforward array - you need to use

Integer indices

> print row[‘title’]

# This fails because you cannot use a string as an integer into an

array. Try  
puts row[0]

---

<div class="post-metadata">

**Author:** ![infinite](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/i/ecc23a/32.png) [@infinite](https://www.ruby-forum.com/u/infinite)\
**Post date:** [June 21, 2008, 11:21am UTC](https://www.ruby-forum.com/t/sqlite3-ruby-problem-accessing-row-values/141030/3 "2008-06-21T11:21:43Z")

</div>

On 6/20/08, The D. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> require “sqlite3”
> 
> query = “select \* from moz\_bookmarks”  
> db = SQLite3::Database.new(“/Users/me/Desktop/places.sqlite”)  
> rows = db.execute(query)  
> rows.each do |row|  
> print row[‘title’]  
> end

Perhaps it would help if you uploaded places.sqlite somewhere (like  
Mediafire) so we can try the program. Otherwise, even the schema would  
help

Les

---

<div class="post-metadata">

**Author:** ![infinite](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/i/ecc23a/32.png) [@infinite](https://www.ruby-forum.com/u/infinite)\
**Post date:** [June 21, 2008, 11:25am UTC](https://www.ruby-forum.com/t/sqlite3-ruby-problem-accessing-row-values/141030/4 "2008-06-21T11:25:14Z")

</div>

On 6/21/08, Leslie V. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> > 
> 
> Perhaps it would help if you uploaded places.sqlite somewhere (like  
> Mediafire) so we can try the program. Otherwise, even the schema would  
> help

Nevermind, it’s easy to create such a database.

Les

---

<div class="post-metadata">

**Author:** ![infinite](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/i/ecc23a/32.png) [@infinite](https://www.ruby-forum.com/u/infinite)\
**Post date:** [June 21, 2008, 11:53am UTC](https://www.ruby-forum.com/t/sqlite3-ruby-problem-accessing-row-values/141030/5 "2008-06-21T11:53:25Z")

</div>

This program gives what you want:

#!/usr/bin/ruby

require “sqlite3”

query = “select \* from moz\_bookmarks”  
db = SQLite3::Database.new(“test.sqlite”)  
db.results\_as\_hash = true  
rows = db.execute(query)  
rows.each do |row|  
#p row  
#puts row.class  
#p row.methods  
puts row[‘title’]  
end

The commented bits will help you with debugging in the future. They  
enable  
you to see what kind of objects you are dealing with.

The answer to selecting rows by column name is to use  
db.results\_as\_hash as above. This was easily discovered via google.

Go here: [http://sqlite-ruby.rubyforge.org/](http://sqlite-ruby.rubyforge.org/)  
Click on the ‘FAQ’ link.

Les

---

<div class="post-metadata">

**Author:** ![infinite](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/i/ecc23a/32.png) [@infinite](https://www.ruby-forum.com/u/infinite)\
**Post date:** [June 21, 2008, 7:03pm UTC](https://www.ruby-forum.com/t/sqlite3-ruby-problem-accessing-row-values/141030/6 "2008-06-21T19:03:05Z")

</div>

You’re welcome. 🙂  
@leslie - cool, I didn’t know about the results\_as\_hash, very handy.

---

<div class="post-metadata">

**Author:** ![infinite](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/i/ecc23a/32.png) [@infinite](https://www.ruby-forum.com/u/infinite)\
**Post date:** [June 21, 2008, 6:49pm UTC](https://www.ruby-forum.com/t/sqlite3-ruby-problem-accessing-row-values/141030/7 "2008-06-21T18:49:31Z")

</div>

Bryan JJ Buckley wrote:

> 2008/6/20 The D. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):
> 
> > require “sqlite3”
> > 
> > query = “select \* from moz\_bookmarks”  
> > db = SQLite3::Database.new(“/Users/me/Desktop/places.sqlite”)  
> > rows = db.execute(query)
> 
> # Rows is an array of arrays…
> 
> > rows.each do |row|
> 
> # At this point, “row” is a straightforward array - you need to use
> 
> Integer indices
> 
> > print row[‘title’]
> 
> # This fails because you cannot use a string as an integer into an
> 
> array. Try  
> puts row[0]

Using integer indices did the trick. Thanks! I was trying to use the  
column name ‘title’. By the way, the places.sqlite file is the file  
where Firefox 3 stores its bookmarks and some other stuff. On OS X, it  
can be found in ~/Library/Application  
Support/Firefox/Profiles/\*.default/.
