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 đó để 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


All Rights Reserved