使用 Ruby 获取 SQLite 元数据
最后修改于 2020 年 7 月 6 日
元数据是关于数据库中数据的信息。 SQLite 中的元数据包含有关我们存储数据的表和列的信息。 SQL 语句影响的行数是元数据。 结果集中返回的行数和列数也是元数据。
SQLite 中的元数据可以使用 PRAGMA
命令获取。SQLite 对象可能具有属性,这些属性就是元数据。最后,我们还可以通过查询 SQLite 系统表 sqlite_master
来获取特定的元数据。
#!/usr/bin/ruby require 'sqlite3' begin db = SQLite3::Database.open "test.db" pst = db.prepare "SELECT * FROM Cars LIMIT 6" puts pst.columns puts pst.types puts pst.column_count rescue SQLite3::Exception => e puts "Exception occurred" puts e ensure pst.close if pst db.close if db end
在上面的例子中,我们获取了预处理语句的列名、列类型和列数。
puts pst.columns puts pst.types puts pst.column_count
这三种方法返回预处理语句的列名、列类型和列数。
$ ./cols_fields.rb Id Name Price INTEGER TEXT INT 3
输出显示了三个列名:Id
、Name
和 Price
。类型为 INTEGER
、TEXT
和 INT
。
下面的例子展示了如何检索特定 SQL 命令产生的更改数量。
#!/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')" db.execute "DELETE FROM Friends WHERE Id IN (3, 4, 5)" n = db.changes puts "There has been #{n} changes" rescue SQLite3::Exception => e puts "Exception occurred" puts e ensure db.close if db end
我们在内存中创建一个 Friends 表。在最后一个 SQL 命令中,我们删除了三行。我们使用 changes
方法获取上一个 SQL 操作完成的更改数量。
db.execute "DELETE FROM Friends WHERE Id IN (3, 4, 5)"
在此 SQL 语句中,我们删除了三行。
n = db.changes puts "There has been #{n} changes"
我们找出上一个 SQL 语句完成的更改数量。
$ ./changes.rb There has been 3 changes
示例输出。
在下一个例子中,我们将查找关于 Cars
表的一些数据。
#!/usr/bin/ruby require 'sqlite3' begin db = SQLite3::Database.open "test.db" stm = db.prepare "PRAGMA table_info('Cars')" 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
在此示例中,我们发出 PRAGMA table_info(tableName)
命令以获取关于我们的 Cars 表的一些元数据信息。
stm = db.prepare "PRAGMA table_info('Cars')" rs = stm.execute
PRAGMA table_info(Cars)
命令为 Cars 表中的每一列返回一行。 结果集中的列包括列顺序号、列名、数据类型、该列是否可以为 NULL
以及该列的默认值。
rs.each do |row| puts row.join "\s" end
我们遍历结果集并打印数据。
$ ./table_info.rb 0 Id INTEGER 0 1 1 Name TEXT 0 0 2 Price INT 0 0
示例的输出。
接下来,我们将从 Cars
表中打印 5 行及其列名。
#!/usr/bin/ruby require 'sqlite3' begin db = SQLite3::Database.open "test.db" rows = db.execute2 "SELECT * FROM Cars LIMIT 5" rows.each do |row| puts "%3s %-8s %s" % [row[0], row[1], row[2]] end rescue SQLite3::Exception => e puts "Exception occurred" puts e ensure db.close if db end
我们将 Cars
表的五行打印到控制台。现在,我们还包括列的名称。记录与列名对齐。
rows = db.execute2 "SELECT * FROM Cars LIMIT 5"
execute2
方法执行给定的 SQL 语句。返回的第一行是列的名称。
rows.each do |row| puts "%3s %-8s %s" % [row[0], row[1], row[2]] end
数据被检索、格式化并打印到终端。
$ ./column_names.rb Id Name Price 1 Audi 52642 2 Mercedes 57127 3 Skoda 9000 4 Volvo 29000 5 Bentley 350000
输出。
在与元数据相关的最后一个示例中,我们将列出 test.db
数据库中的所有表。
#!/usr/bin/ruby require 'sqlite3' begin db = SQLite3::Database.open "test.db" rows = db.execute <<SQL SELECT name FROM sqlite_master WHERE type='table' ORDER BY name;" SQL rows.each do |row| puts row end rescue SQLite3::Exception => e puts "Exception occurred" puts e ensure db.close if db end
该代码示例将当前数据库中所有可用的表打印到终端。
rows = db.execute <<SQL SELECT name FROM sqlite_master WHERE type='table' ORDER BY name;" SQL
表名从 sqlite_master
表中检索。
$ ./list_tables.rb Cars Friends Images
这些是我们系统上的表。
在本 SQLite Ruby 教程中,我们使用了数据库元数据。