Các lệnh Rake DB
This post hasn't been updated for 6 years
Rake là một tiện ích được xây dựng trong Ruby on Rails, nó cung cấp một cách hiệu quả để quản lý các thay đổi của cơ sở dữ liệu. Bạn có thể dễ dàng migrate các thay đổi của cơ sở dữ liệu tới các server bằng cách chỉ sử dụng một dòng lệnh!
Bạn có thể tự hỏi mình trong suốt quá trình phát triển ứng dụng của mình:
- Điều gì xảy ra khi sử dụng các lệnh rake cơ sở dữ liệu?
- Khi nào nên sử dụng chúng?
Hãy xem cách chúng ta có thể sử dụng các lệnh này để thay đổi cơ sở dữ liệu của chúng ta trong khi phát triển một ứng dụng nhé!
Creating
$ rake db:create
Khi bạn tạo ứng dụng Rails của mình lần đầu tiên, nó sẽ không có một cơ sở dữ liệu nào để sử dụng. Để bắt đầu, bạn cần phải chắc chắn rằng cơ sở dữ liệu của bạn đang hoạt động.
Cũng giống như khi bạn được khuyến khích sử dụng các gem khác nhau cho mỗi môi trường, bạn cũng nên tạo ba cơ sở dữ liệu, mỗi cái cho môi trường development, testing và production. Bạn có thể cấu hình chúng trong file config/database.yml
của mình.
default: &default
adapter: postgresql
encoding: unicode
username: username
password: password
host: localhost
port: 5432
development:
<<: *default
database: story_dev
test:
<<: *default
database: story_test
production:
<<: *default
database: story
Migrating
rake db:migrate
Migration thiết lập các bảng trong cơ sở dữ liệu. Khi bạn chạy lệnh migration, nó sẽ tìm trong folder db/migrate/
tất cả các file Ruby và thực thi chúng bằng cách bắt đầu chạt từ file đã tạo lâu nhất. Có dấu thời gian ở đầu mỗi tên file migration.
Mỗi khi bạn migrate cơ sở dữ liệu hoặc thực hiện bất kỳ thay đổi nào đối với nó như thêm một hàng hoặc một cột, thêm một bảng hoặc thay đổi kiểu dữ liệu, bạn phải chạy lệnh này để những thay đổi đó cập nhập trong cơ sở dữ liệu của bạn.
Migration được tạo ra khi bạn chạy các lệnh như rails generate scaffold
, rails generate model
hoặc rails generate migration
.
Initializing
rake db:schema:load
Không giống như rake db:migrate
chạy migations cho các migration chưa chạy, rake db:schema:load
tải schema đã được tạo ra trong db/schema.rb
vào cơ sở dữ liệu.
Luôn luôn sử dụng lệnh này khi:
- Bạn chạy ứng dụng lần đầu tiên.
- Khi bạn đã xóa cơ sở dữ liệu và bạn cần tạo lại nó.
Lưu ý: nếu bạn chạy rake db:schema:load
trên môi trường production, nó sẽ xóa tất cả dữ liệu production của bạn!
Seeding
rake db:seed
Chúng ta luôn có dữ liệu mặc định mà chúng ta muốn có trong ứng dụng của mình cho mục đích testing. Lệnh seed
tồn tại để tự động hóa quá trình này.
Ví dụ: Tạo một admin_user và lưu dữ liệu của nó trong tệpdb/seed.rb
. Khi bạn chạy rake db:seed
nó sẽ load tất cả các dữ liệu của admin vào ứng dụng của bạn.
Admin.create!(email: 'admin@kolosek.com',
password: 'password',
password_confirmation: 'password')
Seed data thường được sử dụng trong môi trường development hoặc staging, chỉ có 1 ít người dùng trên production, bạn chắc chắn sẽ không muốn ứng dụng của bạn trên production sử dụng dữ liệu giả.
Rolling Back
rake db:rollback
Bạn đã tạo ra một migration mà bạn không cần nó hay bạn chỉ đơn giản đã thay đổi suy nghĩ của bạn về nó? Đừng sợ! Khi bạn chạy lệnh này, nó sẽ xem xét migration cuối cùng đã được tạo ra và hoàn tác nó!
Ví dụ: Hãy bắt đầu bằng cách tạo một migration mới với :role
như một số nguyên và chạy migrate. Sau đó, chúng ta quyết định đổi nó thành một string thay vào đó. Vì vậy, chúng ta sẽ chỉnh sửa migration mới được tạo ra và chạy lại, nhưng không có gì xảy ra và các test và factories của bạn sẽ bị fail.
class CreateRoles < ActiveRecord::Migration
def change
create_table :roles do |t|
t.integer :role # we will change this to t.string :role
t.references :user
t.timestamps
end
end
end
Tại sao nó không hoạt động?
Chỉ có migration được tạo ra cuối cùng được chạy với lệnh rake db:migrate
. Điều này có nghĩa là không có thay đổi nào được thực hiện bằng cách chỉnh sửa migration đã tồn tại. Để thực hiện việc này, bạn sẽ cần chạy rake db:rollback
thay thế. Điều này sẽ làm cho Rails thực hiện hai việc:
- Hoàn tác các thay đổi cuối cùng bạn vừa thực hiện với cơ sở dữ liệu.
- Cập nhật dấu thời gian của file migration (ở đầu tên file).
Dropping
rake db:drop
Đôi khi chúng ta muốn xóa tất cả các dữ liệu và bảng biểu và bắt đầu cái mới. Đó là những gì rake db:drop
thực hiện. Nếu bạn muốn giữ dữ liệu bạn có, hãy chắc chắn sao lưu nó trước khi chạy lệnh này.
Việc xóa cơ sở dữ liệu cũng sẽ loại bỏ bất kỳ xung đột trong schema hoặc những dữ liệu không tốt. Khi cơ sở dữ liệu bị xóa, bạn sẽ muốn bắt đầu lại quá trình bằng cách tạo lại database, chạy các migration và seed data. Hãy chắc chắn rằng các test RSpec của bạn sẽ pass sau khi sửa lại cơ sở dữ liệu của bạn!
Hãy chắc chắn rằng bạn không có kết nối với cơ sở dữ liệu mà bạn sẽ xóa.
Resetting
rake db:reset
Đôi khi bạn có thể cần phải xóa cơ sở dữ liệu trên local và bắt đầu lại với dữ liệu được tải từ db/seeds.rb
. Đây là một lệnh hữu ích khi bạn vẫn đang xây dựng schema của mình, và thường cần thêm các trường vào các model hiện có.
Một khi lệnh reset được sử dụng nó sẽ thực hiện như sau:
- Xóa database:
rake db:drop
- Load từ schema:
rake db:schema:load
- Tạo dữ từ file seed:
rake db:seed
Tại sao nó dùng db:schema:load
mà không phải db:migrate
?
rake db:schema:load
nhanh hơn nhiều so với rake db:migrate
bởi vì nó tải schema mà chúng ta đã tạo ra từ db/schema.rb
thay vì chạy qua tất cả các file migrate lại một lần nữa.
Hy vọng những điều này có thể giúp bạn hiểu được sự khác biệt chính giữa các lệnh rake database!
All Rights Reserved