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