冒險村13 - migration notes

13 - migration notes

Database GUI

上個專案跟這個專案剛好 db 都是用 mysql,分享一下匯入資料的方法,還有一些 migration 問題的一些筆記,另外個人滿推以下兩種 database 的 GUI:

兩者都滿好用的也其實都差不多,因為同事都用 Sequal Pro 還有個人剛好也偏好,所以後來主要都是用 Sequal Pro。

連結的方式也很容易,點選左下角的 + 號來新增 new favorite database 名稱,還有設定一些 config 來連結即可,最常用的大概就是把 staging/production 的 database 弄到 local 來重現問題。

點選 export 後選取需要的 table 並輸出 SQL file,詳細的其他需求就看當下需要的使用情況。

import sql to database in local

1
mysql -u root `database_name` < ~/Desktop/export_database_name_with_date_time.sql

database_name 看要匯入的資料庫是哪一個?對應各個 database 後的 ENV 名稱,Rails 6 也支援 multiple database,詳細可以參考 active_record_multiple_databases

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# config > database.yml

default: &default
writer:
adapter: mysql2
encoding: utf8mb4
pool: 20
host: <%= ENV['DATABASE_WRITER_HOST'] %>
database: <%= ENV['DATABASE_NAME'] %>
username: <%= ENV['DATABASE_USER'] %>
password: <%= ENV['DATABASE_PASS'] %>
charset: utf8
reader:
adapter: mysql2
encoding: utf8mb4
pool: 20
host: <%= ENV['DATABASE_READER_HOST'] %>
database: <%= ENV['DATABASE_NAME'] %>
username: <%= ENV['DATABASE_USER'] %>
password: <%= ENV['DATABASE_PASS'] %>
charset: utf8
anotherdb:
adapter: mysql2
encoding: utf8
pool: 20
host: <%= ENV['ANOTHERDB_HOST'] %>
database: <%= ENV['ANOTHERDB_NAME'] %>
username: <%= ENV['ANOTHERDB_USER'] %>
password: <%= ENV['ANOTHERDB_PASS'] %>
migrations_paths: "db/anotherdb_migrate"
# ...

Add column after specific field

時不時會有新的欄位需要新增的到舊有的 table 裡面,但預設 default 的都會在 updated_at 之後,不管是在 GUI 裡看或者是 console 裡面看都會滿不容易觀看的,且如果是與原本的欄位有關聯,會偏向擺在一起,因此我們可以在 migration 中帶 after option 來告知新增在哪個欄位之後,也因為會是先跑 first_name 再跑 last_name 欄位的新增,自然而然 last_name 要新增時可以排在 first_name 之後。

1
2
3
4
5
6
7
# 20210914230020_add_first_name_and_last_name_to_user.rb
class AddFirstNameAndLastNameToUser < ActiveRecord::Migration[6.1]
def change
add_column :users, :first_name, :string, after: :id
add_column :users, :last_name, :string, after: :first_name
end
end

Explicitly specify a Model’s table-name

在建立 table_name 的時候有時候剛好撞到 rails 的慣例,但又不想要取慣例的名字的時候,會需要想設定自己想要的 Table 名稱,像是名為 Index class,Rails 預設會是 indices,但可能對我們來說很不直覺,想要取叫做 indexes 比較合適

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# migration
class CreateIndexes < ActiveRecord::Migration[6.1]
def change
create_table :indexes do |t|
# ...
t.timestamps
end
end
end

# app > models > index.rb
class Index < ApplicationRecord
self.table_name = "indexes"
end

參考來源