本章将向您展示如何连接到数据库以及如何对数据库做一些简单的事情。
开始之前
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
脚本的输出。