原文: http://zetcode.com/db/sqliteruimg/

在 SQLite Ruby 教程的这一章中,我们将使用图像文件。 请注意,有些人反对将图像放入数据库。 在这里,我们只展示如何做。 我们不讨论是否将图像保存在数据库中的技术问题。

  1. sqlite> CREATE TABLE Images(Id INTEGER PRIMARY KEY, Data BLOB);

对于此示例,我们创建一个名为Images的新表。 对于图像,我们使用BLOB数据类型,代表二进制大对象。

插入图像

在第一个示例中,我们将图像插入 SQLite 数据库。

  1. #!/usr/bin/ruby
  2. require 'sqlite3'
  3. begin
  4. fin = File.open "woman.jpg" , "rb"
  5. img = fin.read
  6. rescue SystemCallError => e
  7. puts e
  8. ensure
  9. fin.close if fin
  10. end
  11. begin
  12. db = SQLite3::Database.open 'test.db'
  13. blob = SQLite3::Blob.new img
  14. db.execute "INSERT INTO Images VALUES(1, ?)", blob
  15. rescue SQLite3::Exception => e
  16. puts "Exception occurred"
  17. puts e
  18. ensure
  19. db.close if db
  20. end

我们从当前工作目录中读取图像,并将其写入 SQLite test.db数据库的Images表中。

  1. fin = File.open "woman.jpg" , "rb"
  2. img = fin.read

我们打开并阅读 JPG 图像。 read方法以字符串形式返回数据。

  1. blob = SQLite3::Blob.new img

我们创建SQLite3::Blob类的实例。 它用于处理二进制数据。

  1. db.execute "INSERT INTO Images VALUES(1, ?)", blob

图像被写入数据库。

读取图像

在本节中,我们将执行相反的操作。 我们将从数据库表中读取图像。

  1. #!/usr/bin/ruby
  2. require 'sqlite3'
  3. begin
  4. db = SQLite3::Database.open 'test.db'
  5. data = db.get_first_value "SELECT Data FROM Images LIMIT 1"
  6. f = File.new "woman2.jpg", "wb"
  7. f.write data
  8. rescue SQLite3::Exception, SystemCallError => e
  9. puts "Exception occurred"
  10. puts e
  11. ensure
  12. f.close if f
  13. db.close if db
  14. end

我们从图像表中读取图像数据,并将其写入另一个文件,我们将其称为woman2.jpg

  1. data = db.get_first_value "SELECT Data FROM Images LIMIT 1"

该行从表中选择图像数据。

  1. f = File.new "woman2.jpg", "wb"
  2. f.write data

我们打开一个新的图像文件,并将检索到的数据写入该文件。 然后我们关闭文件。

SQLite Ruby 教程的这一部分专门用于读取和写入图像。