用standalone_migrations來管理資料庫

為何使用standalone_migrations

Rails的優點之一就是資料庫的管理是透過程式碼,這樣的方式讓多人開發時能透過程式碼與版本控制達到整合資料。但是如果只是單純的管理資料庫,而並不需要建立網站時怎麼辦?這時候就可以透過standalone_migrations這個gem來達到相同的效果了。

standalone_migrations的官方網站

使用時機

有資料庫需求卻又不需要建立網站時,例如建立網路爬蟲的時候

建議方式

首先建立專案的資料夾,例如example,然後在裡面細分功能資料夾。依照conversion的設計可以在專案內開啟app, config, db與lib等資料夾。依照官網說明,也需要建立Rakefile,將rake功能載入到專案中,另外如果有使用git,當然gitigore也是要有的。

安裝與使用

依照官網 gem install standalone_migrations,然後建立Rakefile,將以下程式碼帶入:

1
2
3
require 'standalone_migrations'
StandaloneMigrations::Tasks.load_tasks

然後在db資料夾中建立database.yml,如同一般的rails專案一樣:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
development:
adapter: sqlite3
database: db/development.sqlite3
pool: 5
timeout: 5000
production:
adapter: mysql
encoding: utf8
reconnect: false
database: somedatabase_dev
pool: 5
username: root
password:
socket: /var/run/mysqld/mysqld.sock
test: &test
adapter: sqlite3
database: db/test.sqlite3
pool: 5
timeout: 5000

完成後就可以開始使用standalone migrations了。建立migration的方法有點特殊:

rake db:new_migration name=create_first_migration

這時候在db/migrate的資料中會產生一筆新的檔案,官網的使用方式是up與down這兩個方法,不過我試過change也是可以的,就跟一般使用rails專案沒有不同。

1
2
3
4
5
6
7
8
def change
create_table :items do |t|
t.references :category
t.string :title, limit: 11
# ...
t.timestamps
end
end

或者

1
2
3
4
def change
add_column :items, :owner, :string
end

執行的方式也一樣,可以用migrate, rollback等…

1
2
3
4
rake db:migrate
rake db:migrate RAILS_ENV=production
rake db:rollback
rake db:rollback STEP=3

設定的方式很容易,但對於管理確實大大的方便。