Migration - What is this?
Migration - What is this? Bạn là một RoR(Ruby on Rails) developer thì ắt hẳn là bạn đã phải dùng hoặc chí ít thì cũng phải tìm hiểu khi newbie. Nếu là người mới tìm hiểu về RoR và chưa biết về migration thì mình giới thiệu nhé. RoR cho phép người dùng tạo ra những file migration, tự hỏi "file đó ...
Migration - What is this?
- Bạn là một RoR(Ruby on Rails) developer thì ắt hẳn là bạn đã phải dùng hoặc chí ít thì cũng phải tìm hiểu khi newbie. Nếu là người mới tìm hiểu về RoR và chưa biết về migration thì mình giới thiệu nhé. RoR cho phép người dùng tạo ra những file migration, tự hỏi "file đó để làm cái quái gì" đó là những file được tạo ra nhằm mục đích thay đổi cấu trúc của Database Schema dế dàng. và hơn nữa nó giúp các developer dễ dàng kiểm soát được những gì thay đổi trong database thông qua các file migration, có cũng có thể gọi là một bản "Nhật ký" trong việc chỉnh sửa database. RoR cũng cấp cho người dùng một bộ rake task như rake db:migrate và rake db:rollback, đương nhiên bạn cũng có thể dùng rails db:migrate và rails db:rollback. nó giúp cho developer có thể áp dụng hoặc hủy bỏ hoặc cũng như một cỗ máy quay ngược lại thời gian mà đã nông nổi xóa đi một cột rất quan trọng.
- Nghe thì như thiên đường, nhưng thực tế thì chức năng rollback chẳng ai dùng trên môi trường production cả. Thứ nhất Rails cho phép người dùng tương tác với dữ liệu và cả cấu trúc của DB, và khi đã chạy migration rồi thì không có gì đảm bảo là có thể phục hồi lại được cấu trúc hay dữ liệu ban đầu đó nữa. Thứ hai khi rollback thì Rails sẽ tự động cập nhật config/schema.rb và trỏ version về version lúc trước, điều này tai hại là vì nó thay đổi dòng thời gian của version history. Hay nói một cách khác là việc lưu version ở trong bảng schema_migrations là vô nghĩa
- Thế nên mới thấy chức năng rollback của Rails chỉ hữu dụng trên môi trường development, còn khi ở môi trường production thì không hợp lý.
- các cú pháp lệnh cơ bản của migration
- trước khi nói về thêm sửa xóa ... table thì cứ phải tạo được table cái đã nhỉ tạo table theo cấu trúc sau: $ rails g model ten_model field_name:type chú ý khi tạo với lệnh trên thì chỉ là tạo model class thôi chứ muốn nó tạo trong database thì cuộn chuột xuống một tý nhé
- tạo model $ rails generate model model_name
- tạo migration $ rails generate migration ten_class chú ý ten_class có thể tùy ý nhưng có phải migration cũng coi như là một quyển nhật ký database cho các developer trong team cùng xem đúng không? nên tốt nhất nên đặt theo một cấu trúc để "dễ cả đôi bề" thường thì cú pháp đó sẽ là :
<Action>ToTableName
ví dụ: $ rails generate migration AddMoneyToWallet Đến giờ nghịch ngợm rồi, bạn tự tạo cho mình một project mới nhé, để test
- Để thực thi file migration vừa tạo thì chạy lệnh sau $ rake db:migrate
vào database xem kết quả nhé
-
lỡ tay chạy migrate rồi thì chạy lại bằng cách nào? đây nhé: $ rake db:rollback
-
xem thông tin và quá trình tàn phá database thì dùng lệnh sau: $ rake db:migrate:status
-
thay đổi column $ rails g migration ChangeColumnToUser
class ChangeColumnToUser< ActiveRecord::Migration # chạy db:migrate thì vào up def up change_column :users, :name, :string, null: false, default: 0 end # chạy db:rollback thì vào down (quay về trạng thái trước đó) def down change_column :users, :name, :string, null: true, default: 0 end end
Trong ví dụ trên, column name trong model User bị thay đổi thành NOT NULL
- thêm hoặc xóa column
$ rails g migration AddColumnToUser age:integer
class AddColumnToUser < ActiveRecord::Migration def change # Add add_column :users, :age, :integer # Remove remove_column :users, :age, :integer # chỉ định vị trí thêm vào add_column :users, :age, :integer, :after => :name end end
- thêm hoặc index $ rails g migration AddIndexToUser
class AddIndexToUser < ActiveRecord::Migration def change # Add add_index :users, :name # Delete remove_index :users, :name # Trường hợp tạo index cho nhiều columns add_index :users, [:name, :name2] end end
cũng đơn giản đúng không nào hehe