在 SQLite 中使用 Ruby 进行 SQL 查询
最后修改于 2020 年 7 月 6 日
我们已经建立了与数据库的连接。现在我们将修改并从数据库中获取数据。
数据使用 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。 所有行都将作为 Hash 对象返回,其中列名作为键。
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
方法,我们选择一行的特定字段。 在我们的例子中,它是 Bentley 汽车的价格。
$ ./fetchvalue.rb 350000
这是输出。
在本 SQLite Ruby 教程中,我们演示了如何使用各种方法从数据库中获取数据。