SQLite Ruby 连接数据库

本章将向您展示如何连接到数据库以及如何对数据库做一些简单的事情。

开始之前

SQLite 附带sqlite3命令行实用程序。 它可用于对数据库发出 SQL 命令。 现在,我们将使用sqlite3命令行工具创建一个新数据库。

$ sqlite3 test.db
SQLite version 3.6.22
Enter ".help" for instructions
Enter SQL statements terminated with a ";"

我们为sqlite3工具提供了一个参数。 test.db是数据库名称。 它是我们磁盘上的单个文件。 如果存在,则将其打开。 如果不是,则创建它。

sqlite> .tables
sqlite> .exit
$ ls
test.db

.tables命令提供了 test.db 数据库中的表列表。 当前没有表。 .exit命令终止sqlite3命令行工具的交互式会话。 ls Unix 命令显示当前工作目录的内容。 我们可以看到test.db文件。 所有数据将存储在该单个文件中。

sqlite-ruby接口用于使用 Ruby 语言与 SQLite 数据库进行交互。

$ sudo apt-get install libsqlite3-ruby

上面的命令将模块安装在基于 Debian 的 Linux 系统上。

第一步是创建一个Database对象。 Database类封装了到 SQLite 数据库的单个连接。 使用close方法关闭数据库对象。

SQLite3::Database.new dbname
SQLite3::Database.open dbname

new方法创建一个新的数据库对象,该对象将打开给定的dbname文件。 如果该文件不存在,则将尽可能创建它。 默认情况下,新数据库将结果行作为数组返回。 open方法打开给定文件中包含的数据库。

SQLite3::Database.new ":memory:"

如果我们为文件名提供特殊字符串:memory:,则可以创建一个内存数据库。

版本

在第一个代码示例中,我们将获得 SQLite 数据库的版本。

#!/usr/bin/ruby

require 'sqlite3'

begin

    db = SQLite3::Database.new ":memory:"
    puts db.get_first_value 'SELECT SQLITE_VERSION()'

rescue SQLite3::Exception => e 

    puts "Exception occurred"
    puts e

ensure
    db.close if db
end

在上面的 Ruby 脚本中,我们创建了一个新的内存数据库。 我们执行一条 SQL 语句,该语句返回 SQLite 数据库的版本。

require 'sqlite3'

我们使用sqlite3 Ruby 模块连接到 SQLite 数据库。

db = SQLite3::Database.new ":memory:"

我们创建一个新的数据库对象。 Database 类封装了到 SQLite 数据库的单个连接。 数据库在内存中创建。 因此它不是永久的。

puts db.get_first_value 'SELECT SQLITE_VERSION()'

我们将db对象的get_first_value方法调用。 它执行 SQL 语句并获得结果集第一行的第一个值。

rescue SQLite3::Exception => e 

    puts "Exception occurred"
    puts e

我们检查错误。 这很重要,因为使用数据库容易出错。

ensure
    db.close if db
end

最后,我们释放资源。

$ ./version.rb
3.7.7

输出可能类似于上面。

插入数据

我们将创建一个Cars表并在其中插入几行。

#!/usr/bin/ruby

require 'sqlite3'

begin

    db = SQLite3::Database.open "test.db"
    db.execute "CREATE TABLE IF NOT EXISTS Cars(Id INTEGER PRIMARY KEY, 
        Name TEXT, Price INT)"
    db.execute "INSERT INTO Cars VALUES(1,'Audi',52642)"
    db.execute "INSERT INTO Cars VALUES(2,'Mercedes',57127)"
    db.execute "INSERT INTO Cars VALUES(3,'Skoda',9000)"
    db.execute "INSERT INTO Cars VALUES(4,'Volvo',29000)"
    db.execute "INSERT INTO Cars VALUES(5,'Bentley',350000)"
    db.execute "INSERT INTO Cars VALUES(6,'Citroen',21000)"
    db.execute "INSERT INTO Cars VALUES(7,'Hummer',41400)"
    db.execute "INSERT INTO Cars VALUES(8,'Volkswagen',21600)"

rescue SQLite3::Exception => e 

    puts "Exception occurred"
    puts e

ensure
    db.close if db
end

上面的脚本创建一个Cars表,并将 8 行插入到该表中。

db = SQLite3::Database.open "test.db"

我们连接到test.db数据库。

db.execute "CREATE TABLE IF NOT EXISTS Cars(Id INTEGER PRIMARY KEY, 
    Name TEXT, Price INT)"

execute方法执行给定的 SQL 语句。 如果尚不存在新的 Cars 表,则会创建该表。

db.execute "INSERT INTO Cars VALUES(1,'Audi',52642)"
db.execute "INSERT INTO Cars VALUES(2,'Mercedes',57127)"

这两行将两辆车插入桌子。 请注意,默认情况下,我们处于 自动提交模式,其中对表的所有更改均立即生效。

sqlite> .mode column  
sqlite> .headers on

我们使用sqlite3工具验证写入的数据。 首先,我们修改数据在控制台中的显示方式。 我们使用列模式并打开标题。

sqlite> SELECT * FROM Cars;
Id          Name        Price     
----------  ----------  ----------
1           Audi        52642     
2           Mercedes    57127     
3           Skoda       9000      
4           Volvo       29000     
5           Bentley     350000    
6           Citroen     21000     
7           Hummer      41400     
8           Volkswagen  21600 

这是我们已写入Cars表的数据。

最后插入的行 ID

有时我们需要确定最后插入的行的 ID。 我们使用last_insert_row_id方法找到它。

#!/usr/bin/ruby

require 'sqlite3'

begin

    db = SQLite3::Database.new ":memory:"

    db.execute "CREATE TABLE Friends(Id INTEGER PRIMARY KEY, Name TEXT)"
    db.execute "INSERT INTO Friends(Name) VALUES ('Tom')"
    db.execute "INSERT INTO Friends(Name) VALUES ('Rebecca')"
    db.execute "INSERT INTO Friends(Name) VALUES ('Jim')"
    db.execute "INSERT INTO Friends(Name) VALUES ('Robert')"
    db.execute "INSERT INTO Friends(Name) VALUES ('Julian')"

    id = db.last_insert_row_id
    puts "The last id of the inserted row is #{id}"

rescue SQLite3::Exception => e 

    puts "Exception occurred"
    puts e

ensure
    db.close if db
end

我们在内存中创建一个Friends表。 Id自动递增。

db.execute "CREATE TABLE Friends(Id INTEGER PRIMARY KEY, Name TEXT)"

在 SQLite 中,INTEGER PRIMARY KEY列自动增加。 还有一个AUTOINCREMENT关键字。 在INTEGER PRIMARY KEY AUTOINCREMENT中使用时,会使用稍微不同的算法来创建Id

db.execute "INSERT INTO Friends(Name) VALUES ('Tom')"
db.execute "INSERT INTO Friends(Name) VALUES ('Rebecca')"
db.execute "INSERT INTO Friends(Name) VALUES ('Jim')"
db.execute "INSERT INTO Friends(Name) VALUES ('Robert')"
db.execute "INSERT INTO Friends(Name) VALUES ('Julian')"

这五个 SQL 语句将五行插入到Friends表中。

id = db.last_insert_row_id

使用last_insert_row_id方法,我们获得最后插入的行Id

$ ./last_rowid.rb 
The last id of the inserted row is 5

我们看到了脚本的输出。

取得数据

在本章的最后一个示例中,我们获取一些数据。 有关数据获取的更多信息将在“查询”一章中进行讨论。

#!/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表中获取 5 行。

stm = db.prepare "SELECT * FROM Cars LIMIT 5" 
rs = stm.execute 

我们准备要使用prepare方法执行的 SQL 语句。 该方法返回一个语句对象。 然后,使用execute方法执行 SQL 语句。 它返回一个结果集。 ResutlSet对象是查询返回的数据上的简单光标。

rs.each do |row|
    puts row.join "\s"
end

使用each方法,我们遍历结果集中的数据。 在每个循环中,它返回一行。 该行是一个字段数组。 这些字段用空白连接起来形成一条线。

$ ./fetch.rb 
1 Audi 52642
2 Mercedes 57127
3 Skoda 9000
4 Volvo 29000
5 Bentley 350000

这是fetch.rb脚本的输出。

赞(0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址