ล้างหรือสร้างฐานข้อมูล Ruby on Rails ใหม่


582

ฉันมีฐานข้อมูล dev Ruby on Rails เต็มไปด้วยข้อมูล ฉันต้องการลบทุกอย่างและสร้างฐานข้อมูลอีกครั้ง ฉันกำลังคิดที่จะใช้สิ่งที่ชอบ:

rake db:recreate

เป็นไปได้ไหม


ฉันขอแนะนำให้มองผ่านคำตอบที่ได้รับการโหวตสูงสุด ในความคิดของฉันrake db:drop db:create db:schema:loadอาจจะเหมาะสมกว่าrake db:drop db:create db:migrate(แม้ว่าฉันพร้อมที่จะผิดเกี่ยวกับเรื่องนี้)
Jason Swett


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

db:drop + db:create + db:migrate == db:migrate:reset. ฉันมักจะหันไปใช้db:schema:loadเมื่อการโยกย้ายถูกทำลาย ฉันไม่ค่อยต้องการสร้างฐานข้อมูลใหม่ดังนั้นความเร็วจึงไม่สำคัญมากนัก นอกจากนี้หากคุณมีการย้ายข้อมูลที่ยังไม่ได้ใช้db:schema:loadและdb:resetจะไม่นำไปใช้ ไม่แน่ใจว่าเป็นเรื่องที่ถกเถียงกันมาก
x-yuri

คำตอบ:


1074

ฉันรู้สองวิธีในการทำสิ่งนี้:

สิ่งนี้จะรีเซ็ตฐานข้อมูลของคุณและโหลดสคีมาปัจจุบันของคุณใหม่ด้วยทั้งหมด:

rake db:reset db:migrate

สิ่งนี้จะทำลาย db ของคุณแล้วสร้างมันขึ้นมาจากนั้นย้าย schema ปัจจุบันของคุณ:

rake db:drop db:create db:migrate

ข้อมูลทั้งหมดจะหายไปในทั้งสองสถานการณ์


36
ดูเหมือนว่าrake db:resetจะทำการโยกย้ายทั้งหมด (อย่างน้อยบน Rails 3) ดังนั้นควรเป็นสิ่งที่จำเป็นใช่ไหม
plindberg

1
หรือค่อนข้างจะปล่อยให้สคีมาเหมือนกับสิ่งที่เรียกใช้การย้ายข้อมูลทั้งหมดที่มี แต่การโอนย้ายจะไม่ทำงานต่อ se (ดังนั้นหากคุณมีการย้ายข้อมูลที่แทรกข้อมูลนั้นจะไม่เกิดขึ้นสำหรับสิ่งนี้คุณควรใช้ไฟล์ db / seeds.rb จริงๆ
plindberg

1
ฉันรู้ว่าสำหรับแอป Tracks GTD db: migrate ไม่ทำงาน ฉันต้องทำ db: รีเซ็ตเมื่อย้ายจาก Sqlite3 ไปเป็น Postgres
เขาวงกต

11
คุณจะต้องเรียกใช้rake db:test:prepareสำหรับการทดสอบมิฉะนั้นคุณจะได้รับข้อผิดพลาดเช่น:Could not find table 'things' (ActiveRecord::StatementInvalid)
s2t2

31
ใครบางคนควรจะทำให้ชัดเจนว่าrake db:resetและทำสองสิ่งที่แตกต่างกันทั้งrake db:drop db:create db:migrate หลังเช็ดออกจากฐานข้อมูลแอปทั้งหมดสร้างขึ้นใหม่จากนั้นผ่านการโยกย้ายทุกครั้งเพื่ออัปเดตสคีมา ( db/schema.rbหรือdb/structure.sql) แต่ไม่เติมด้วยข้อมูลเมล็ด สิ่งแรกคือชื่อแทนrake db:drop db:schema:load db:seedดังนั้นจึงลบล้างฐานข้อมูลแอปทั้งหมด แต่ไม่ได้อัปเดตสคีมาแล้วเติมด้วยข้อมูลเมล็ด ดังนั้นหากคุณไม่ได้เปลี่ยนแปลงอะไรเลยในการย้ายข้อมูลครั้งแรกเร็วกว่าหลังปลอดภัยกว่า
Claudio Floreani

157

บน Rails 4 สิ่งที่จำเป็นทั้งหมดคือ

$ rake db:schema:load

ที่จะลบเนื้อหาทั้งหมดใน DB ของคุณและสร้าง schema จากไฟล์ schema.rb ของคุณใหม่โดยไม่ต้องใช้การย้ายข้อมูลทั้งหมดทีละรายการ


6
ใช้งานได้กับราง 3 เช่นกัน มีประโยชน์สำหรับเมื่อคุณเพิ่งสับสนฐานข้อมูลทดสอบของคุณและต้องการรีเซ็ตเป็นเวอร์ชันทำงานที่ตรงกับ dev db ของคุณ
bigpotato

ขอบคุณสำหรับสิ่งนี้. ฉันไม่ได้ตระหนักถึงสิ่งนั้นdb:dropและdb:createซ้ำซ้อน
Grant Birchmeier

3
นี่ไม่ได้อัปเดตสกีมาไม่ใช่วิธีที่ปลอดภัยหากคุณปรับโครงสร้างการย้ายข้อมูลของคุณใหม่
Claudio Floreani

นี่คือคำตอบที่ดีที่สุดสำหรับฉัน
roxdurazo

2
@ClaudioFloreani การโอนย้ายการ refactoring กำลังถามถึงปัญหา เมื่อพวกเขาทำงานพวกเขาควรถูกทิ้งให้อยู่คนเดียวอย่างถาวร
nrowegt

45

ฉันใช้หนึ่งซับต่อไปนี้ใน Terminal

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

ฉันใส่สิ่งนี้เป็นชื่อแทนเชลล์และตั้งชื่อมัน remigrate

ในตอนนี้คุณสามารถ "รวม" งานรางได้อย่างง่ายดาย:

$ 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
นั่นคือการเรียกใช้การย้ายข้อมูลทั้งหมดของคุณหนึ่งรายการซึ่งไม่สามารถปรับขนาดได้และมีแนวโน้มที่จะเกิดข้อผิดพลาด นอกจากนี้ฉันค่อนข้างแน่ใจว่า db: โอนย้ายอัพเดต schema.rb ของคุณดังนั้นสกีมาของคุณ: dump ไม่ได้ทำอะไรที่มีประโยชน์
coreyward

ดังนั้นหนึ่งไม่ว่างฐานข้อมูลได้อย่างไร ในการพัฒนา ... ล้างมันออกทั้งหมด
AnApprentice

3
@AnApprentice คุณสามารถเรียกใช้db:resetซึ่งเป็นเพียง Google (หรือตรวจสอบคำแนะนำ ) ความคิดเห็นของฉันไม่ได้ที่จะให้คำแนะนำกับการใช้ แต่หลีกเลี่ยงการใช้เมื่อสิ่งที่คุณต้องการจริงๆคือdb:migrate db:schema:load
coreyward

7
อย่างไรก็ตาม @TK คุณไม่จำเป็นต้องเรียกใช้สิ่งเหล่านี้ทั้งหมดเนื่องจากกระบวนการแยกต่างหากขึ้นอยู่กับสถานะการออกในช่วงสุดท้าย แต่เพียงแค่ผ่านงานทั้งหมดที่ต้องการเช่นดังนั้น:rake rake db:drop db:create db:schema:load
coreyward

1
มันเป็นเรื่องเล็ก ๆ น้อย ๆ แต่ฉันไม่เคยมีปัญหาในการทำงานdb:migrate... ในขณะที่db:schema:loadมีความไวต่อคนที่ลืมตรวจสอบ schema.rb ในการควบคุมเวอร์ชันควบคู่ไปกับการโยกย้ายใหม่
johncip

37

อัพเดท: ใน Rails 5 คำสั่งนี้จะสามารถเข้าถึงได้ผ่านคำสั่งนี้:

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


ในฐานะของ Rails 4.2 รุ่นใหม่ล่าสุดคุณสามารถรัน:

rake db:purge 

ที่มา: กระทำ

# 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

มันสามารถใช้ร่วมกันตามที่กล่าวไว้ข้างต้น:

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

ในฐานะที่เป็น @bekicot ชัดกล่าวว่าในภาษาอังกฤษdb:purge"ลบข้อมูลทั้งหมด แต่รักษาทุกตารางและคอลัมน์"
MCB

@ MCB ฉันผิด sory เกี่ยวกับที่db:purge ไม่รักษาตาราง
Yana Agun Siswanto

29

คุณสามารถใช้ ...

rake db:create

... เพื่อสร้างฐานข้อมูลตั้งแต่ต้นconfig/database.ymlหรือ ...

rake db:schema:load

... เพื่อสร้างฐานข้อมูลตั้งแต่เริ่มต้นจากschema.rbไฟล์ของคุณ


1
คุณต้องลบฐานข้อมูลก่อน…หรือคุณสามารถลบตารางได้ถ้าต้องการ
coreyward

5
+1 สำหรับการโหลดสคีมา บางครั้งการโยกย้ายเกิดความสับสน แต่สคีมาควรเป็นสิ่งที่ถูกรักษาไว้
Danny

ฉันอ่านใน The Rails 3 Way ว่าการโหลด schema เป็นวิธีที่จะดำเนินการซึ่งต่างจากการเรียกใช้การย้ายข้อมูลทั้งหมด ฉันจำไม่ได้ว่าเหตุผลของพวกเขาคืออะไร แต่ดูเหมือนสมเหตุสมผล หากผลลัพธ์สุดท้ายเหมือนกันทั้งสองวิธีดูเหมือนง่ายกว่าและมีข้อผิดพลาดน้อยกว่าเพียงแค่โหลดฐานข้อมูลจากสคีมาเพื่อเรียกใช้การย้ายข้อมูลจำนวนมาก
Jason Swett

3
เหตุผลก็คือการย้ายข้อมูลหมายถึงการโอนย้ายข้อมูลและมีความเปราะเมื่อเวลาผ่านไปเมื่อโมเดลของคุณเปลี่ยนแปลง คุณสามารถ (และควร) อบในโมเดลที่มีขอบเขตน้อยที่สุดในการโยกย้ายของคุณเมื่อใดก็ตามที่เป็นไปได้เพื่อให้แน่ใจว่ามันจะทำงาน แต่สิ่งนี้ก็ไม่ได้ปรับขนาดได้ดีและมีประสิทธิภาพน้อยกว่า . เหตุใดจึงต้องพึ่งพาการย้ายข้อมูลเพื่อสร้างฐานข้อมูลที่ดูเหมือนว่าสคีมาของคุณเมื่อคุณสามารถสร้างจากพิมพ์เขียวได้
coreyward

13

จากการรันบรรทัดคำสั่ง

rake db:migrate:reset

นี่เป็นวิธีเดียวที่ทำให้แอปสามารถเรียกใช้การย้ายข้อมูลทั้งหมดอีกครั้ง เพราะแต่ละการโยกย้ายทำให้การเปลี่ยนแปลงschema.rbและหากคุณเพียงdropและcreate, migrateจะทำอะไร (ทดสอบบนราง 6)
แชมพู

12

ใช้เหมือน

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

ทั้งหมดในหนึ่งบรรทัด สิ่งนี้เร็วกว่าเนื่องจากสภาพแวดล้อมจะไม่ถูกโหลดซ้ำอีกครั้ง

db: drop - จะปล่อยฐานข้อมูล

db: create - จะสร้างฐานข้อมูล(โฮสต์ / db / รหัสผ่านจะถูกนำมาจาก config / database.yml)

db: migrate - จะเรียกใช้การย้ายข้อมูลที่มีอยู่จากไดเรกทอรี(db / migration / .rb) *

db: seed - จะรันข้อมูล seed ที่เป็นไปได้จากไดเร็กทอรี(db / migration / seed.rb) ..

ฉันชอบ:

rake db:reset

ทำทั้งหมดในครั้งเดียว

ไชโย!


1
ฉันต้องการเพิ่ม db: test: เตรียมตัวสำหรับสิ่งนี้เพื่อวัดที่ดี ขึ้นอยู่กับว่าคุณกำลังทำการทดสอบหรือไม่
ctc

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

11

เพียงออกลำดับขั้นตอน: วางฐานข้อมูลแล้วสร้างใหม่อีกครั้งโยกย้ายข้อมูลและถ้าคุณมีเมล็ดให้หว่านฐานข้อมูล:

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

เนื่องจากสภาวะแวดล้อมดีฟอลต์สำหรับrakeคือการพัฒนาในกรณีที่คุณเห็นข้อยกเว้นในการทดสอบข้อมูลจำเพาะคุณควรสร้าง db ใหม่สำหรับสภาพแวดล้อมการทดสอบดังต่อไปนี้:

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

ในกรณีส่วนใหญ่ฐานข้อมูลการทดสอบจะถูกหว่านในระหว่างขั้นตอนการทดสอบดังนั้นจึงdb:seedไม่จำเป็นต้องดำเนินการตามภารกิจ มิฉะนั้นคุณจะต้องเตรียมฐานข้อมูล:

rake db:test:prepare

หรือ

RAILS_ENV=test rake db:seed

นอกจากนี้ในการใช้งานสร้างใหม่คุณสามารถเพิ่มลงในRakefileรหัสต่อไปนี้:

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

จากนั้นออก:

rake db:recreate

8

คุณสามารถทำได้ด้วยตนเอง:

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

หรือเพียงแค่rake db:resetซึ่งจะเรียกใช้ขั้นตอนข้างต้น แต่จะเรียกใช้db/seeds.rbไฟล์ ของคุณ

ความแตกต่างเล็กน้อยคือrake db:resetโหลดโดยตรงจากschema.rbไฟล์ของคุณซึ่งตรงข้ามกับการเรียกใช้ไฟล์การย้ายข้อมูลทั้งหมดอีกครั้ง

ข้อมูลของคุณจะถูกพัดหายไปในทุกกรณี



4

หากต้องการวางฐานข้อมูลเฉพาะคุณสามารถทำได้บนคอนโซลทางรถไฟ:

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

แล้วย้ายฐานข้อมูลอีกครั้ง

$bundle exec rake db:migrate 

4

บน Rails 4.2 เพื่อลบข้อมูลทั้งหมด แต่เก็บรักษาฐานข้อมูลไว้

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

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


ดี ... แค่ลองดู แต่มันไม่ได้รักษาตารางและคอลัมน์ คุณต้องรัน db: migrate หลังจากรัน db: purge ดังนั้นสิ่งนี้จะไม่รักษาตารางและคอลัมน์ แต่มันจะรักษาฐานข้อมูลตัวเองเพื่อให้คุณไม่ต้อง db: สร้าง
Freddo

1
@Cedric คุณพูดถูก db: purge ไม่ได้เก็บรักษาตารางไว้ ฉันอัปเดตรหัสแล้ว
Yana Agun Siswanto



1

เนื่องจากในการพัฒนาคุณจะต้องการสร้างฐานข้อมูลใหม่คุณสามารถกำหนดภารกิจ rake ในโฟลเดอร์ lib / task เช่นนั้น

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

และใน terminal คุณจะทำงาน

rake db:all

มันจะสร้างฐานข้อมูลของคุณใหม่


1

ฉันคิดว่าวิธีที่ดีที่สุดในการรันคำสั่งนี้:

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

1

เพียงคุณวิ่งได้

rake db:setup

มันจะดร็อปฐานข้อมูลสร้างฐานข้อมูลใหม่และเติม db จาก seed หากคุณสร้างไฟล์ seed ด้วยข้อมูลบางส่วน


1

3 ตัวเลือกผลลัพธ์เดียวกัน:

1.ทุกขั้นตอน:

  $ 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.รีเซ็ต:

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

3.โยกย้าย: รีเซ็ต:

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

หมายเหตุ:

  • หากใช้สคีมา: โหลดจะเร็วกว่าการย้ายข้อมูลทั้งหมด แต่ผลลัพธ์เหมือนกัน
  • ข้อมูลทั้งหมดจะสูญหาย
  • คุณสามารถเรียกใช้ rakes หลาย ๆ ตัวในหนึ่งบรรทัด
  • ทำงานกับรางได้ 3.

0

วันนี้ฉันได้ทำการเปลี่ยนแปลงสคีมารางของฉันค่อนข้างน้อย ฉันรู้ว่าฉันต้องการอีกสองรุ่นในลำดับชั้นและอื่น ๆ ที่จะถูกลบออก มีการเปลี่ยนแปลงเล็กน้อยในโมเดลและคอนโทรลเลอร์

ฉันเพิ่มรุ่นใหม่สองรุ่นและสร้างโดยใช้:

rake db:migrate

จากนั้นฉันก็แก้ไขไฟล์ schema.rb ฉันลบรุ่นเก่าที่ไม่ต้องการด้วยตนเองเปลี่ยนฟิลด์คีย์ต่างประเทศตามต้องการและเพิ่งเรียงลำดับใหม่เล็กน้อยเพื่อให้ชัดเจนยิ่งขึ้น ฉันลบการโยกย้ายทั้งหมดแล้วเรียกใช้งานบิลด์อีกครั้งผ่าน:

rake db:reset

มันทำงานได้อย่างสมบูรณ์ แน่นอนว่าข้อมูลทั้งหมดจะต้องถูกโหลดซ้ำ Rails ตระหนักถึงการโยกย้ายที่ถูกลบและรีเซ็ตเครื่องหมายน้ำสูง:

-- assume_migrated_upto_version(20121026094813, ["/Users/sean/rails/f4/db/migrate"])
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.