sqlite3-ruby problem accessing row values

T

The Doobs

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
 
B

Bryan JJ Buckley

2008/6/20 The Doobs said:
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 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]
 
L

Leslie Viljoen

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

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
 
L

Leslie Viljoen

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


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
 
L

Leslie Viljoen

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/
Click on the 'FAQ' link.

Les
 
T

The Doobs

Bryan said:
2008/6/20 The Doobs said:
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/.
 
B

Bryan JJ Buckley

You're welcome. :)
@leslie - cool, I didn't know about the results_as_hash, very handy.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,769
Messages
2,569,580
Members
45,055
Latest member
SlimSparkKetoACVReview

Latest Threads

Top