Dọn dẹp hoặc tạo lại cơ sở dữ liệu Ruby on Rails


582

Tôi có một cơ sở dữ liệu Ruby on Rails đầy dữ liệu. Tôi muốn xóa mọi thứ và xây dựng lại cơ sở dữ liệu. Tôi đang nghĩ về việc sử dụng một cái gì đó như:

rake db:recreate

Điều này có thể không?


Tôi khuyên bạn nên nhìn qua câu trả lời nâng cao nhất. Theo tôi rake db:drop db:create db:schema:loadcó thể phù hợp hơn rake db:drop db:create db:migrate(mặc dù tôi đã sẵn sàng sai về điều đó).
Jason Swett


2
rake db:drop db:create db:migrate
William Hampshire

db:drop + db:create + db:migrate == db:migrate:reset. Tôi thường dùng đến db:schema:load, khi di cư bị phá vỡ. Tôi hiếm khi cần tạo lại cơ sở dữ liệu, vì vậy tốc độ không thành vấn đề. Ngoài ra, nếu bạn có các di chuyển chưa được áp dụng db:schema:loaddb:resetsẽ không áp dụng chúng. Không chắc chắn nếu đó là nhiều tranh luận.
x-yuri

Câu trả lời:


1074

Tôi biết hai cách để làm điều này:

Điều này sẽ thiết lập lại cơ sở dữ liệu của bạn và tải lại lược đồ hiện tại của bạn với tất cả:

rake db:reset db:migrate

Điều này sẽ phá hủy db của bạn và sau đó tạo nó và sau đó di chuyển lược đồ hiện tại của bạn:

rake db:drop db:create db:migrate

Tất cả dữ liệu sẽ bị mất trong cả hai kịch bản.


36
Dường như rake db:resetcũng chạy tất cả các lần di chuyển (ít nhất là trên Rails 3), vì vậy đó là tất cả những gì cần thiết, phải không?
plindberg

1
Hoặc, đúng hơn, nó để lược đồ giống hệt với những gì chạy tất cả các di chuyển sẽ có. Nhưng việc di chuyển không chạy theo từng se (vì vậy nếu bạn có di chuyển chèn dữ liệu, điều đó sẽ không xảy ra; đối với điều này, bạn thực sự nên sử dụng tệp db / seed.rb).
plindberg

1
Tôi biết rằng đối với ứng dụng Track GTD db: di chuyển không hoạt động. Tôi đã phải thực hiện db: reset khi chuyển từ Sqlite3 sang Postgres.
mê cung

11
Bạn cũng cần chạy rake db:test:prepaređể kiểm tra, nếu không bạn sẽ gặp lỗi như:Could not find table 'things' (ActiveRecord::StatementInvalid)
s2t2

31
Ai đó nên làm rõ điều đó rake db:resetrake db:drop db:create db:migrate làm hai việc hoàn toàn khác nhau . Cái sau sẽ xóa toàn bộ cơ sở dữ liệu ứng dụng, tạo lại nó và sau đó đi qua mọi lần di chuyển để cập nhật lược đồ ( db/schema.rbhoặc db/structure.sql), nhưng không lấp đầy nó với dữ liệu hạt giống. Thay vào đó, đầu tiên là một bí danh rake db:drop db:schema:load db:seed, vì vậy nó xóa sạch toàn bộ cơ sở dữ liệu ứng dụng nhưng nó không cập nhật lược đồ và sau đó điền dữ liệu hạt giống. Vì vậy, nếu bạn không thay đổi bất cứ điều gì trong quá trình di chuyển của mình, lần đầu tiên nhanh hơn, lần sau sẽ an toàn hơn.
Claudio Floreani

157

Trên Rails 4, tất cả cần thiết là

$ rake db:schema:load

Điều đó sẽ xóa toàn bộ nội dung trên DB của bạn và tạo lại lược đồ từ tệp giản đồ.rb của bạn, mà không phải áp dụng tất cả các lần di chuyển từng cái một.


6
làm việc cho đường ray 3 là tốt. hữu ích khi bạn vừa làm hỏng cơ sở dữ liệu thử nghiệm của mình và muốn đặt lại nó thành phiên bản hoạt động phù hợp với dev db của bạn
bigpotato

Cám ơn vì cái này. Tôi đã không nhận ra điều đó db:dropdb:createlà dư thừa.
Grant Birchmeier

3
Điều này không cập nhật lược đồ, không phải là một cách an toàn nếu bạn cấu trúc lại các lần di chuyển của mình.
Claudio Floreani

đây là câu trả lời tốt nhất cho tôi
roxdurazo

2
@ClaudioFloreani tái cấu trúc di chuyển đang yêu cầu sự cố. Khi chúng chạy, chúng sẽ bị bỏ lại một mình, vĩnh viễn.
nrowegt

45

Tôi sử dụng một lớp lót sau trong Terminal.

$ rake db:drop && rake db:create && rake db:migrate && rake db:schema:dump && rake db:test:prepare

Tôi đặt nó như một bí danh vỏ và đặt tên cho nó remigrate

Đến bây giờ, bạn có thể dễ dàng "xâu chuỗi" các tác vụ Rails:

$ rake db:drop db:create db:migrate db:schema:dump db:test:prepare # db:test:prepare no longer available since Rails 4.1.0.rc1+

12
Điều đó sẽ chạy tất cả các lần di chuyển của bạn lần lượt, không thể mở rộng và dễ bị lỗi. Ngoài ra, tôi khá chắc chắn db: di chuyển cập nhật lược đồ của bạn, vì vậy lược đồ của bạn: dump không làm gì hữu ích.
coreyward

vậy làm thế nào để một cơ sở dữ liệu trống? trong sự phát triển ... xóa tất cả
AnApprentice

3
@AnApprentice Bạn có thể chạy db:reset, đó chỉ là một Google (hoặc kiểm tra Hướng dẫn ). Nhận xét của tôi không khuyên bạn không nên sử dụng nó, nhưng để tránh sử dụng db:migratekhi bạn thực sự muốn db:schema:load.
coreyward

7
Nhân tiện, @TK, bạn thực sự không cần phải chạy tất cả những quy trình này dưới dạng các quy trình riêng biệt phụ thuộc vào trạng thái thoát cuối cùng. Thay vào đó, chỉ cần chuyển tất cả các nhiệm vụ mong muốn rake, như vậy : rake db:drop db:create db:schema:load.
coreyward

1
Đó là giai thoại, nhưng tôi chưa bao giờ gặp sự cố khi chạy db:migrate... trong khi db:schema:loadnhạy cảm với việc ai đó quên kiểm tra lược đồ.rb vào kiểm soát phiên bản cùng với di chuyển mới.
johncip 2/2/2016

37

Cập nhật: Trong Rails 5, lệnh này sẽ có thể truy cập thông qua lệnh này:

rails db:purge db:create db:migrate RAILS_ENV=test


Kể từ phiên bản 4.2 mới nhất, bạn có thể chạy:

rake db:purge 

Nguồn: cam kết

# desc "Empty the database from DATABASE_URL or config/database.yml for the current RAILS_ENV (use db:drop:all to drop all databases in the config). Without RAILS_ENV it defaults to purging the development and test databases."
  task :purge => [:load_config] do
    ActiveRecord::Tasks::DatabaseTasks.purge_current
  end

Nó có thể được sử dụng cùng nhau như đã đề cập ở trên:

rake db:purge db:create db:migrate RAILS_ENV=test

Như @bekicot nói bằng tiếng Anh đơn giản hơn db:purge"xóa tất cả dữ liệu nhưng bảo toàn tất cả các bảng và cột"
MCB

@MCB Tôi đã sai, sory về điều đó, db:purge không bảo quản các bảng.
Yana Agun Siswanto

29

Tùy thuộc vào những gì bạn muốn, bạn có thể sử dụng

rake db:create

Để xây dựng cơ sở dữ liệu từ đầu config/database.ymlhoặc

rake db:schema:load

Để xây dựng cơ sở dữ liệu từ đầu từ schema.rbtập tin của bạn .


1
Bạn phải loại bỏ cơ sở dữ liệu trước tiên hoặc bạn có thể xóa các bảng nếu muốn.
coreyward

5
+1 cho tải lược đồ. đôi khi việc di chuyển bị rối tung, nhưng lược đồ nên là những gì được giữ nguyên.
Daniel

Tôi đọc trong The Rails 3 Way rằng tải lược đồ là cách để đi, trái ngược với việc chạy tất cả các di chuyển. Tôi không nhớ chính xác lý do của họ là gì nhưng nó có vẻ hợp lý. Nếu kết quả cuối cùng là một trong hai cách, có vẻ đơn giản và ít xảy ra lỗi hơn khi chỉ tải cơ sở dữ liệu từ lược đồ hơn là chạy một loạt các di chuyển.
Jason Swett

3
Lý do là việc di chuyển có nghĩa là để di chuyển dữ liệu và ngày càng trở nên giòn theo thời gian khi mô hình của bạn thay đổi. Bạn có thể (và nên) nướng các mô hình có phạm vi tối thiểu vào di chuyển của mình bất cứ khi nào khả thi để đảm bảo chúng chạy, nhưng điều này không có quy mô tốt và kém hiệu quả hơn nhiều so với việc xây dựng cơ sở dữ liệu từ những gì ứng dụng biết là điểm cuối cùng . Tại sao phải dựa vào di chuyển để tạo cơ sở dữ liệu trông giống như lược đồ của bạn khi bạn chỉ có thể xây dựng từ bản thiết kế?
coreyward

13

Từ dòng lệnh chạy

rake db:migrate:reset

đây là cách duy nhất khiến ứng dụng chạy lại tất cả các lần di chuyển. Bởi vì mỗi di cư làm thay đổi schema.rbvà nếu bạn chỉ dropcreate, migratesẽ không làm gì cả (thử nghiệm trên đường ray 6)
dầu gội đầu

12

Sử dụng như

rake db:drop db:create db:migrate db:seed

Tất cả trong một dòng. Điều này nhanh hơn vì môi trường không được tải lại nhiều lần.

db: drop - sẽ bỏ cơ sở dữ liệu.

db: tạo - sẽ tạo cơ sở dữ liệu (máy chủ / db / mật khẩu sẽ được lấy từ config / database.yml)

db: di chuyển - sẽ chạy các di chuyển hiện có từ thư mục (db / di chuyển / .rb) *.

db: seed - sẽ chạy dữ liệu hạt giống có thể từ thư mục (db / di chuyển / seed.rb) ..

Tôi thường thích:

rake db:reset

làm tất cả cùng một lúc

Chúc mừng!


1
Tôi muốn thêm db: test: chuẩn bị cho điều này, cho biện pháp tốt. Tất nhiên, điều này phụ thuộc vào việc bạn có đang thử nghiệm hay không.
ctc

db:reset == db:drop + db:schema:load + db:seed,db:migrate:reset == db:drop + db:create + db:migrate
x-yuri

11

Chỉ cần đưa ra chuỗi các bước: bỏ cơ sở dữ liệu, sau đó tạo lại nó, di chuyển dữ liệu và nếu bạn có hạt giống, hãy gieo cơ sở dữ liệu:

rake db:drop db:create db:migrate db:seed

Vì môi trường mặc định cho rakephát triển , nên trong trường hợp nếu bạn thấy ngoại lệ trong các thử nghiệm cụ thể, bạn nên tạo lại db cho môi trường thử nghiệm như sau:

RAILS_ENV=test rake db:drop db:create db:migrate

Trong hầu hết các trường hợp, cơ sở dữ liệu kiểm tra đang được gieo trong các quy trình kiểm tra, do đó, db:seedhành động tác vụ không bắt buộc phải được thông qua. Nếu không, bạn sẽ chuẩn bị cơ sở dữ liệu:

rake db:test:prepare

hoặc là

RAILS_ENV=test rake db:seed

Ngoài ra, để sử dụng tác vụ tạo lại, bạn có thể thêm vào Rakefile đoạn mã sau:

namespace :db do
   task :recreate => [ :drop, :create, :migrate ] do
      if ENV[ 'RAILS_ENV' ] !~ /test|cucumber/
         Rake::Task[ 'db:seed' ].invoke
      end
   end
end

Sau đó, vấn đề:

rake db:recreate

8

Bạn có thể tự làm:

rake db:drop
rake db:create
rake db:migrate

Hoặc chỉ rake db:reset, sẽ chạy các bước trên nhưng cũng sẽ chạy db/seeds.rbtệp của bạn .

Một sắc thái được thêm vào là rake db:resettải trực tiếp từ schema.rbtệp của bạn thay vì chạy lại tất cả các tệp di chuyển.

Dữ liệu của bạn bị thổi bay trong mọi trường hợp.



4

Để loại bỏ một cơ sở dữ liệu cụ thể, bạn có thể làm điều này trên bảng điều khiển rails:

$rails console
Loading development environment
1.9.3 > ActiveRecord::Migration.drop_table(:<table_name>)
1.9.3 > exit

Và sau đó di chuyển DB một lần nữa

$bundle exec rake db:migrate 

4

Trên đường ray 4.2, để xóa tất cả dữ liệu nhưng bảo toàn cơ sở dữ liệu

$ bin/rake db:purge && bin/rake db:schema:load

https://github.com/rails/rails/blob/4-2-urdy/activerecord/CHANGELOG.md


Chà ... Chỉ cần thử nó, nhưng nó không bảo tồn các bảng và cột. Bạn phải chạy db: di chuyển sau khi chạy db: purge. Vì vậy, điều này không bảo tồn các bảng và cột. Tuy nhiên, nó tự bảo vệ cơ sở dữ liệu để bạn không phải db: tạo
Freddo

1
@Cedric Bạn nói đúng, db: purge không bảo toàn bảng. Tôi đã cập nhật mã.
Yana Agun Siswanto

3

Bạn có thể sử dụng db:reset- để chạy db: drop và db: setup hoặc db:migrate:reset- chạy db: drop, db: tạo và db: di chuyển.

phụ thuộc vào bạn muốn sử dụng lược đồ tồn tại.rb



1

Bởi vì trong quá trình phát triển, bạn sẽ luôn muốn tạo lại cơ sở dữ liệu, bạn có thể xác định một tác vụ cào trong thư mục lib / task của mình như thế.

  namespace :db do
      task :all => [:environment, :drop, :create, :migrate] do
   end 
end

và trong thiết bị đầu cuối, bạn sẽ chạy

rake db:all

nó sẽ xây dựng lại cơ sở dữ liệu của bạn


1

Tôi nghĩ cách tốt nhất để chạy lệnh này:

**rake db:reset** it does db:drop, db:setup
 rake db:setup does db:create, db:schema:load, db:seed

1

Đơn giản là bạn có thể chạy

rake db:setup

Nó sẽ bỏ cơ sở dữ liệu, tạo cơ sở dữ liệu mới và điền db từ hạt giống nếu bạn tạo tệp hạt giống với một số dữ liệu.


1

3 tùy chọn, kết quả tương tự:

1. Tất cả các bước:

  $ rake db:drop           # deletes the database for the current env
  $ rake db:create         # creates the database for the current env
  $ rake db:schema:load    # loads the schema already generated from schema.rb / erases data
  $ rake db:seed           # seed with initial data

2. Đặt lại:

  $ rake db:reset          # drop / schema:load / seed

3. Di chuyển: đặt lại:

  $ rake db:migrate:reset  # drop / create / migrate
  $ rake db:seed

Ghi chú:

  • Nếu lược đồ: tải được sử dụng nhanh hơn thực hiện tất cả các di chuyển, nhưng cùng một kết quả.
  • Tất cả dữ liệu sẽ bị mất.
  • Bạn có thể chạy nhiều cào trong một dòng.
  • Hoạt động với đường ray 3.

0

Hôm nay tôi đã thực hiện một vài thay đổi cho lược đồ đường ray của mình. Tôi nhận ra rằng tôi cần thêm hai mô hình trong hệ thống phân cấp và một số mô hình khác sẽ bị xóa. Có rất nhiều thay đổi cần thiết cho các mô hình và bộ điều khiển.

Tôi đã thêm hai mô hình mới và tạo ra chúng, sử dụng:

rake db:migrate

Sau đó, tôi chỉnh sửa tệp giản đồ.rb. Tôi đã xóa thủ công các mô hình cũ không còn cần thiết, thay đổi trường khóa ngoại theo yêu cầu và chỉ sắp xếp lại một chút để làm cho nó rõ ràng hơn với tôi. Tôi đã xóa tất cả các lần di chuyển và sau đó chạy lại bản dựng qua:

rake db:reset

Nó hoạt động hoàn hảo. Tất cả các dữ liệu phải được tải lại, tất nhiên. Rails nhận ra việc di chuyển đã bị xóa và thiết lập lại mực nước cao:

-- assume_migrated_upto_version(20121026094813, ["/Users/sean/rails/f4/db/migrate"])
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.