原文: http://zetcode.com/db/sqliteruby/meta/

    元数据是有关数据库中数据的信息。 SQLite 中的元数据包含有关我们存储数据的表和列的信息。 SQL 语句影响的行数是元数据。 结果集中返回的行数和列数也是元数据。

    可以使用PRAGMA命令获取 SQLite 中的元数据。 SQLite 对象可能具有属性,即元数据。 最后,我们还可以通过查询 SQLite 系统sqlite_master表来获取特定的元数据。

    1. #!/usr/bin/ruby
    2. require 'sqlite3'
    3. begin
    4. db = SQLite3::Database.open "test.db"
    5. pst = db.prepare "SELECT * FROM Cars LIMIT 6"
    6. puts pst.columns
    7. puts pst.types
    8. puts pst.column_count
    9. rescue SQLite3::Exception => e
    10. puts "Exception occurred"
    11. puts e
    12. ensure
    13. pst.close if pst
    14. db.close if db
    15. end

    在上面的示例中,我们获得了预备语句的列名,列类型和列数。

    1. puts pst.columns
    2. puts pst.types
    3. puts pst.column_count

    这三种方法返回预备语句的列名,列类型和列数。

    1. $ ./cols_fields.rb
    2. Id
    3. Name
    4. Price
    5. INTEGER
    6. TEXT
    7. INT
    8. 3

    输出显示三个列名称:IdNamePrice。 类型是INTEGERTEXTINT

    以下示例显示如何检索特定 SQL 命令产生的更改数量。

    1. #!/usr/bin/ruby
    2. require 'sqlite3'
    3. begin
    4. db = SQLite3::Database.new ":memory:"
    5. db.execute "CREATE TABLE Friends(Id INTEGER PRIMARY KEY, Name TEXT)"
    6. db.execute "INSERT INTO Friends(Name) VALUES ('Tom')"
    7. db.execute "INSERT INTO Friends(Name) VALUES ('Rebecca')"
    8. db.execute "INSERT INTO Friends(Name) VALUES ('Jim')"
    9. db.execute "INSERT INTO Friends(Name) VALUES ('Robert')"
    10. db.execute "INSERT INTO Friends(Name) VALUES ('Julian')"
    11. db.execute "DELETE FROM Friends WHERE Id IN (3, 4, 5)"
    12. n = db.changes
    13. puts "There has been #{n} changes"
    14. rescue SQLite3::Exception => e
    15. puts "Exception occurred"
    16. puts e
    17. ensure
    18. db.close if db
    19. end

    我们在内存中创建一个Friends表。 在最后一个 SQL 命令中,我们删除三行。 我们使用changes方法来获取上一次 SQL 操作完成的更改数量。

    1. db.execute "DELETE FROM Friends WHERE Id IN (3, 4, 5)"

    在此 SQL 语句中,我们删除三行。

    1. n = db.changes
    2. puts "There has been #{n} changes"

    我们找出上一条 SQL 语句完成的更改数量。

    1. $ ./changes.rb
    2. There has been 3 changes

    示例输出。

    在下一个示例中,我们将找到有关Cars表的一些数据。

    1. #!/usr/bin/ruby
    2. require 'sqlite3'
    3. begin
    4. db = SQLite3::Database.open "test.db"
    5. stm = db.prepare "PRAGMA table_info('Cars')"
    6. rs = stm.execute
    7. rs.each do |row|
    8. puts row.join "\s"
    9. end
    10. rescue SQLite3::Exception => e
    11. puts "Exception occurred"
    12. puts e
    13. ensure
    14. stm.close if stm
    15. db.close if db
    16. end

    在此示例中,我们发出PRAGMA table_info(tableName)命令以获取有关Cars表的一些元数据信息。

    1. stm = db.prepare "PRAGMA table_info('Cars')"
    2. rs = stm.execute

    PRAGMA table_info(Cars)命令为 Cars 表中的每一列返回一行。 结果集中的列包括列顺序号,列名称,数据类型,该列是否可以为NULL以及该列的默认值。

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

    我们遍历结果集并打印数据。

    1. $ ./table_info.rb
    2. 0 Id INTEGER 0 1
    3. 1 Name TEXT 0 0
    4. 2 Price INT 0 0

    示例的输出。

    接下来,我们将打印Cars表中的 5 行及其列名。

    1. #!/usr/bin/ruby
    2. require 'sqlite3'
    3. begin
    4. db = SQLite3::Database.open "test.db"
    5. rows = db.execute2 "SELECT * FROM Cars LIMIT 5"
    6. rows.each do |row|
    7. puts "%3s %-8s %s" % [row[0], row[1], row[2]]
    8. end
    9. rescue SQLite3::Exception => e
    10. puts "Exception occurred"
    11. puts e
    12. ensure
    13. db.close if db
    14. end

    我们将Cars表的五行打印到控制台。 现在,我们也包括列的名称。 记录与列名对齐。

    1. rows = db.execute2 "SELECT * FROM Cars LIMIT 5"

    execute2方法执行给定的 SQL 语句。 返回的第一行是列的名称。

    1. rows.each do |row|
    2. puts "%3s %-8s %s" % [row[0], row[1], row[2]]
    3. end

    数据被检索,格式化并打印到终端。

    1. $ ./column_names.rb
    2. Id Name Price
    3. 1 Audi 52642
    4. 2 Mercedes 57127
    5. 3 Skoda 9000
    6. 4 Volvo 29000
    7. 5 Bentley 350000

    输出。

    在与元数据有关的最后一个示例中,我们将列出test.db数据库中的所有表。

    1. #!/usr/bin/ruby
    2. require 'sqlite3'
    3. begin
    4. db = SQLite3::Database.open "test.db"
    5. rows = db.execute <<SQL
    6. SELECT name FROM sqlite_master
    7. WHERE type='table'
    8. ORDER BY name;"
    9. SQL
    10. rows.each do |row|
    11. puts row
    12. end
    13. rescue SQLite3::Exception => e
    14. puts "Exception occurred"
    15. puts e
    16. ensure
    17. db.close if db
    18. end

    该代码示例将当前数据库中的所有可用表打印到终端。

    1. rows = db.execute <<SQL
    2. SELECT name FROM sqlite_master
    3. WHERE type='table'
    4. ORDER BY name;"
    5. SQL

    表名称是从sqlite_master表中检索的。

    1. $ ./list_tables.rb
    2. Cars
    3. Friends
    4. Images

    这些是我们系统上的表。

    在 SQLite Ruby 教程的这一部分中,我们使用了数据库元数据。