# 连接到 SQLite 数据库

> 原文： [http://zetcode.com/db/sqliteruby/connect/](http://zetcode.com/db/sqliteruby/connect/)

SQLite Ruby 教程的这一部分将向您展示如何连接到数据库以及如何对数据库做一些简单的事情。

## 开始之前

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

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

```

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

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

```

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

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

```ruby
$ sudo apt-get install libsqlite3-ruby

```

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

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

```ruby
SQLite3::Database.new dbname
SQLite3::Database.open dbname

```

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

```ruby
SQLite3::Database.new ":memory:"

```

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

## 数据来源

创建本教程时，请参考 [sqlite-ruby.rubyforge.org](http://sqlite-ruby.rubyforge.org/) 网站。

## 版本

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

```ruby
#!/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 数据库的版本。

```ruby
require 'sqlite3'

```

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

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

```

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

```ruby
puts db.get_first_value 'SELECT SQLITE_VERSION()'

```

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

```ruby
rescue SQLite3::Exception => e 

    puts "Exception occurred"
    puts e

```

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

```ruby
ensure
    db.close if db
end

```

最后，我们释放资源。

```ruby
$ ./version.rb
3.7.7

```

输出可能类似于上面。

## 插入数据

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

```ruby
#!/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 行插入到该表中。

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

```

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

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

```

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

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

```

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

```ruby
sqlite> .mode column  
sqlite> .headers on

```

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

```ruby
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`方法找到它。

```ruby
#!/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`自动递增。

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

```

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

```ruby
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`表中。

```ruby
id = db.last_insert_row_id

```

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

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

```

我们看到了脚本的输出。

## 取得数据

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

```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`表中获取 5 行。

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

```

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

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

```

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

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

```

这是`fetch.rb`脚本的输出。

在 SQLite Ruby 教程的这一章中，我们展示了如何建立与 SQLite 数据库的数据库连接。 我们已经解释了对数据库进行一些基本工作的脚本。