一般框架不會使用單純的 file-base 的資料庫
這樣無法做多工的任務
所以接下來我們要使用 SQL databases
記得 Rails 的 ActiveRecord 是使用 ORM 模式嗎?
即使今天沒有 migration ,我們仍然需要 table 來存資料
安裝 SQLite 之前,確認一下你的電腦有沒有安裝
# rainbow/rainbow.gemspec
gem.add_runtime_dependency "erubis"
gem.add_development_dependency "rack-test"
gem.add_runtime_dependency "multi_json"
gem.add_runtime_dependency "sqlite3" # <- 增加這行
> bundle install
SQLite 會在本機存資料庫,除此之外,他還會多工運作,就像真的資料庫一樣
我們來建立新的資料庫檔案及裡面的table
# best_quotes/mini_migration.rb
require "sqlite3"
conn = SQLite3::Database.new "test.db"
conn.execute << SQL
create table my_table (
id INTEGER PRIMARY KEY,
posted INTEGER,
title VARCHAR(30),
body VARCHAR(32000));
SQL
> bundle exec ruby mini_migration.rb
mini-migration 會用 id 做一個 table
這個 table 會存在檔案中,名稱是 test.db
並且會有三個欄位,分別是 title 、 body 、 posted,前面兩個是字串型態,後面是數字型態
Rainbow 需要知道這個 table 跟 column,並且去使用他們
我們來看看 SQLite 的 schema
# rainbow/lib/rainbow/sqlite_model.rb
require "sqlite3"
require "rainbow/util"
DB = SQLite3::Database.new "test.db"
module Rainbow
module Model
class SQLite
def self.table
Rainbow.to_underscore name
end
def self.schema
return @schema if @schema
@schema = {}
DB.table_info(table) do |row|
@schema[row["name"]] = row["type"]
end
@schema
end
end
end
end
我們來確認一下 SQLite 這個 class 中有沒有 table 的名字
並且使用 table_info 這個方法來抓出 schema
@schema 是在這個 class 下的實體變數
在這個 class 以及 繼承的 class 中,只能有一個 @schema
web 小辭典
table_info: 將 table 的欄位資訊列出
schema: 紀錄資料庫的欄位、型態,以及任何 table 的異動
我們常會在 irb 中發現錯誤,可能是因為我們載入多次的函示庫
# best_quotes/sqlite_test.rb
require "sqlite3"
require "rainbow/sqlite_model"
class MyTable < Rainbow::Model::SQLite; end
STDERR.puts MyTable.schema.inspect
當這段程式碼被執行時,他會去讀 schema 然後把錯誤訊息印出來
這時我們要用 bundle 來執行 sqlite_test.rb 這個檔案
> bundle exec ruby sqlite_test.rb
如果是得到一個空 hash,確認一下有沒有做 mini- migration,沒有就現在做
或者我們可以到 irb 環境載入 Rainbow (類似 rails console) 並且在裡面試
執行下列程式碼
> bundle exec irb -r rulers
> require_relative "./ sqlite_test.rb"
假設已經有個 table 了
你會發現在 irb 環境中沒有足夠的方法讓你去使用
我們明天就來做些方法給他