我们已经建立了到数据库的连接。 现在我们要修改并从数据库中获取数据。
使用SELECT
语句从数据库中检索数据。 在 SQLite Ruby 模块中,首先我们使用prepare
方法准备 SQL 语句。 SQL 字符串被发送到数据库引擎,该引擎检查语句的有效性,语法,并在某些数据库中检查执行某些查询的用户权限。 如果一切正常,则将语句对象返回到 Ruby 脚本。 下一步是对execute
方法的调用。 该方法在数据库内执行查询。 检索数据。
Ruby SQLite 模块有几种从数据库表中获取数据的方法。 准备并执行 SQL 语句后,我们可以遍历返回的数据。
取得数据
在第一个示例中,我们从Cars
表中获取一行。
#!/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
在示例中,我们执行所有步骤以从Cars
表中获取第一行。
stm = db.prepare "SELECT * FROM Cars WHERE Id=?"
SELECT
语句是使用prepare
方法准备的。 返回一个语句对象。
stm.bind_param 1, id
参数绑定到语句中的占位符。
rs = stm.execute
该语句被执行。 返回ResultSet
对象。
row = rs.next
我们从结果集中获得下一行。 因为我们只想获取一行,所以我们只调用一次next
方法。
puts row.join "\s"
该行是一个 Ruby 数组。 使用join
方法,将三个字段与一个空格字符连接起来以形成一行。
$ ./fetch.rb
1 Audi 52642
这是示例的输出。
在下面的示例中,我们将获取五行。 我们将next
方法放入 while 循环中。
#!/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
在此脚本中,我们连接到数据库并获取Cars
表的 5 行。
stm = db.prepare "SELECT * FROM Cars LIMIT 5"
这是用于提取 5 行的 SQL 语句。
while (row = rs.next) do
puts row.join "\s"
end
next
方法放在 while 循环中。 它返回结果集中的下一行。 如果没有剩余的行,则该方法返回 nil,而 while 循环终止。
我们可以使用each
方法从结果集中获取数据。
#!/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
同样,我们从Cars
表中选择五行。
rs.each do |row|
puts row.join "\s"
end
我们使用each
方法来迭代结果集。
下一个示例显示数据库对象的execute
方法。 这是一种方便的方法,可以节省一些击键。
#!/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
该示例从Cars
表中选择并打印五行。
rows = db.execute "SELECT * FROM Cars LIMIT 5"
在这里,我们一步一步完成了两项工作。 我们准备语句并执行它。 该方法以 Ruby 数组形式返回数据。
for row in rows do
puts row.join "\s"
end
我们从 Ruby 数组中打印数据。
到目前为止,我们已经看到以ResultSet
或数组形式返回的数据。 下一个示例将以哈希数组的形式返回数据。 这样,我们可以通过列名来标识字段值。
#!/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
在示例中,我们通过字段的列名获取字段。
db.results_as_hash = true
我们将results_as_hash
属性设置为 true。 所有行将作为哈希对象返回,以列名作为键。
ary.each do |row|
printf "%s %s %s\n", row['Id'], row['Name'], row['Price']
end
我们通过字段的列名获取字段。
$ ./fetch_hash.rb
1 Audi 52642
2 Mercedes 57127
3 Skoda 9000
4 Volvo 29000
5 Bentley 350000
我们看到示例的输出。
获取行
Ruby SQLite 模块有两种方便的方法来检索行。 在第一个示例中,我们将从表中获得一行。
#!/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
我们获得Cars
表第一行的数据。
row = db.get_first_row "SELECT * FROM Cars WHERE Id=1"
get_first_row
方法获取第一行,并丢弃所有其他行。
puts row.join "\s"
该行将打印到控制台。
$ ./fetchrow.rb
1 Audi 52642
在这里,我们看到fetchrow.rb
示例的输出。
在最后一个示例中,我们选择一个值。
#!/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
我们为特定的汽车选择价格。
val = db.get_first_value "SELECT Price FROM Cars WHERE Name='Bentley'"
使用get_first_value
方法,我们选择一行的特定字段。 在我们的案例中,这是宾利汽车的价格。
$ ./fetchvalue.rb
350000
这是输出。