ความแตกต่างระหว่าง rake db: migrate db: reset และ db: schema: load


619

ความแตกต่างระหว่างrake db:migrateและrake db:resetชัดเจนในหัวของฉัน สิ่งที่ฉันไม่เข้าใจก็คือrake db:schema:loadความแตกต่างจากสองสิ่งนี้

เพียงเพื่อให้แน่ใจว่าฉันอยู่ในหน้าเดียวกัน:

  • rake db:migrate - เรียกใช้การย้ายข้อมูลที่ยังไม่ได้เรียกใช้
  • rake db:reset- ล้างฐานข้อมูล (สมมุติrake db:drop+ rake db:create+ rake db:migrate) และเรียกใช้การย้ายข้อมูลบนฐานข้อมูลใหม่

กรุณาช่วยอธิบายหากความเข้าใจของฉันผิดไป


10
ไม่rake --tasksช่วยเหลือ?
zx1986

คุณควรตรวจสอบบล็อกนี้ jacopretorius.net/2014/02/…
Bishisht Bhatta

ความเข้าใจของคุณrake db:migrateถูกต้อง แต่ความเข้าใจของคุณrake db:resetนั้นผิด ดูคำตอบสูงสุดจากมอริตซ์
Magne

1
BTW เป็นของทางรถไฟ 5 คำสั่งเหล่านี้สามารถเรียกว่าเป็นrails db:migrate, ,rails db:reset rails db:schema:loadดูstackoverflow.com/questions/38403533/…
Purplejacket

คำตอบ:


1303
  • db: การโยกย้ายทำงาน (เดียว) การโยกย้ายที่ยังไม่ได้ทำงาน
  • db: createสร้างฐานข้อมูล
  • db: dropลบฐานข้อมูล
  • db: schema: loadสร้างตารางและคอลัมน์ภายในฐานข้อมูล (ที่มีอยู่) ดังต่อไปนี้ schema.rb

  • db: setupทำ db: create, db: schema: load, db: seed

  • db: resetไม่ db: drop, db: setup
  • db: migrate: resetทำ db: drop, db: create, db: migrate

โดยทั่วไปแล้วคุณจะใช้ db: migrate หลังจากทำการเปลี่ยนแปลง schema ผ่านไฟล์การโยกย้ายใหม่ (ซึ่งจะสมเหตุสมผลเมื่อมีข้อมูลในฐานข้อมูลอยู่แล้ว) db: schema: load ใช้เมื่อคุณตั้งค่าอินสแตนซ์ใหม่ของแอปของคุณ

ฉันหวังว่าจะช่วย


อัพเดทสำหรับราง 3.2.12:

ฉันเพิ่งตรวจสอบแหล่งที่มาและการอ้างอิงเป็นดังนี้:

  • db: createสร้างฐานข้อมูลสำหรับ env ปัจจุบัน
  • db: create: allสร้างฐานข้อมูลสำหรับ env ทั้งหมด
  • db: dropลดลงฐานข้อมูลสำหรับ env ปัจจุบัน
  • db: drop: ทั้งหมดลดลงฐานข้อมูลสำหรับ envs ทั้งหมด
  • db: migrateรัน migrations สำหรับ env ปัจจุบันที่ยังไม่ได้รัน
  • db: migrate: up ทำการโอนย้ายข้อมูลหนึ่งครั้ง
  • db: migrate: downย้อนกลับหนึ่งการโอนย้ายที่เฉพาะเจาะจง
  • db: migrate: statusแสดงสถานะการโยกย้ายปัจจุบัน
  • db: rollback ย้อนกลับการโยกย้ายครั้งล่าสุด
  • db: ไปข้างหน้าเลื่อนเวอร์ชันสกีมาปัจจุบันไปยังเวอร์ชันถัดไป
  • db: seed (only) รันไฟล์ db / seed.rb
  • db: schema: loadโหลด schema ลงในฐานข้อมูลของ env ปัจจุบัน
  • db: schema: dump ดัมพ์สกีมาของ env ปัจจุบัน (และดูเหมือนว่าจะสร้าง db ด้วย)

  • db: setupรัน db: schema: load, db: seed

  • db: resetรัน db: drop db: setup
  • db: migrate: redo run (db: migrate: down db: migrate: up) หรือ (db: rollback db: migrate) ขึ้นอยู่กับการโอนย้ายที่ระบุ
  • db: migrate: resetรัน db: drop db: create db: migrate

สำหรับข้อมูลเพิ่มเติมโปรดดูที่https://github.com/rails/rails/blob/v3.2.12/activerecord/lib/active_record/railties/databases.rake (สำหรับ Rails 3.2.x) และhttps: // github .com / rails / rails / blob / v4.0.5 / activerecord / lib / active_record / railties / database.rake (สำหรับ Rails 4.0.x)


16
นี่คือไฟล์ที่มีคำตอบ :) - github.com/rails/rails/blob/master/activerecord/lib/…
cutalion

3
@cutation: db: setup ไม่ได้รัน db: migrate แน่นอนว่ามันจะเปราะเกินกว่าที่จะรันการย้ายข้อมูลทั้งหมดสำหรับการตั้งค่า db (นี่คือสิ่งที่ schema.rb ใช้)
อริตซ์

2
ฉันกำลังดำเนินการ db: รีเซ็ตและมันเป็นฐานข้อมูลของฉัน ทำไมถึงเป็นเช่นนั้น?
Alejandro Riedel

db: setupยังทำงานdb:createถ้าจำเป็น อย่างน้อยราว 4.0.2
ด่าน

Rails 4 จะทำงานrake db:migrateเมื่อมีการโทรrake db:setupหากมีการย้ายข้อมูลที่ค้างอยู่ แต่จะไม่ดำเนินการโอนย้ายที่ค้างอยู่
Pooyan Khosravi

24

TLDR

ใช้

  • rake db:migrate หากคุณต้องการเปลี่ยนแปลงสคีมา
  • rake db:resetหากคุณต้องการลบฐานข้อมูลให้โหลดสคีมาschema.rbใหม่และป้อนฐานข้อมูลอีกครั้ง
  • rake db:schema:loadหากคุณต้องการรีเซ็ตฐานข้อมูลเป็นสคีมาตามที่ระบุในschema.rb(จะเป็นการลบข้อมูลทั้งหมด)

คำอธิบาย

rake db:schema:loadจะตั้งค่าสคีมาตามที่ระบุในschema.rbไฟล์ สิ่งนี้มีประโยชน์สำหรับการติดตั้งแอพใหม่เพราะไม่ต้องใช้เวลามากdb:migrate

หมายเหตุสำคัญdb:schema:loadจะลบข้อมูลบนเซิร์ฟเวอร์

rake db:migrateเปลี่ยนแปลงสกีมาที่มีอยู่ มันเหมือนกับการสร้างเวอร์ชันของสกีมา db:migrateจะค้นหาdb/migrate/ไฟล์ทับทิมใด ๆ และเรียกใช้การย้ายข้อมูลที่ยังไม่เริ่มต้น แต่เก่าที่สุด Rails รู้ว่าไฟล์ใดที่เก่าที่สุดโดยดูที่การประทับเวลาที่จุดเริ่มต้นของชื่อไฟล์การย้ายข้อมูล db:migrateมาพร้อมกับประโยชน์ที่สามารถใส่ข้อมูลลงในฐานข้อมูล นี่ไม่ใช่วิธีปฏิบัติที่ดี มันดีกว่าที่จะใช้rake db:seedเพื่อเพิ่มข้อมูล

rake db:migrateให้งานขึ้น , ลงฯลฯ ซึ่งจะช่วยให้คำสั่งเช่นrake db:rollbackและทำให้มันเป็นคำสั่งที่มีประโยชน์มากที่สุด

rake db:resetทำ a db:dropและdb:setup
มันลดลงฐานข้อมูลสร้างอีกครั้งโหลด schema และเริ่มต้นด้วยข้อมูลเมล็ด

ส่วนที่เกี่ยวข้องของคำสั่งจากdatabase.rake


namespace :schema do
  desc 'Creates a db/schema.rb file that is portable against any DB supported by Active Record'
  task :dump => [:environment, :load_config] do
    require 'active_record/schema_dumper'
    filename = ENV['SCHEMA'] || File.join(ActiveRecord::Tasks::DatabaseTasks.db_dir, 'schema.rb')
    File.open(filename, "w:utf-8") do |file|
      ActiveRecord::SchemaDumper.dump(ActiveRecord::Base.connection, file)
    end
    db_namespace['schema:dump'].reenable
  end

  desc 'Loads a schema.rb file into the database'
  task :load => [:environment, :load_config, :check_protected_environments] do
    ActiveRecord::Tasks::DatabaseTasks.load_schema_current(:ruby, ENV['SCHEMA'])
  end

  # desc 'Drops and recreates the database from db/schema.rb for the current environment and loads the seeds.'
  task :reset => [ 'db:drop', 'db:setup' ]

namespace :migrate do
  # desc  'Rollbacks the database one migration and re migrate up (options: STEP=x, VERSION=x).'
  task :redo => [:environment, :load_config] do
    if ENV['VERSION']
      db_namespace['migrate:down'].invoke
      db_namespace['migrate:up'].invoke
    else
      db_namespace['rollback'].invoke
      db_namespace['migrate'].invoke
    end
  end

ดังนั้นหากคุณสร้าง schema ที่ใช้งานจริงโดยใช้ db: schema: load (สร้างจากชุดของการย้ายข้อมูลก่อนหน้านี้) จะทำให้ทราบว่าการโยกย้ายใด (ที่มีส่วนร่วมในการสร้าง schema.rb) ไม่จำเป็นต้องรันในอนาคต invocations ของ db: โยกย้าย?
CanadaIT

2

เท่าที่ฉันเข้าใจมันจะลดลงฐานข้อมูลของคุณและสร้างขึ้นใหม่ตามdb/schema.rbไฟล์ของคุณ นี่คือเหตุผลที่คุณต้องทำให้แน่ใจว่าschema.rbไฟล์ของคุณทันสมัยและอยู่ภายใต้การควบคุมเวอร์ชันเสมอ


0

คุณสามารถดูได้ในงาน Active Record Rake เพราะเป็นที่ที่ฉันเชื่อว่าพวกเขามีชีวิตเช่นเดียวกับในไฟล์นี้ https://github.com/rails/rails/blob/fe1f4b2ad56f010a4e9b93d547d63a15953d9dc2/activerecord/lib/active_record/tasks/database_tasks.rb

คำถามของคุณถูกต้องหรือไม่

ขึ้นอยู่กับว่าพวกเขามาจากไหนและนี่เป็นเพียงตัวอย่างเพื่อแสดงว่าพวกเขาแตกต่างกันไปตามภารกิจ ที่นี่เรามีไฟล์ที่แตกต่างกันเต็มไปด้วยงาน

https://github.com/rails/rails/blob/fe1f4b2ad56f010a4e9b93d547d63a15953d9dc2/activerecord/Rakefile

ซึ่งมีภารกิจเหล่านี้

namespace :db do
  task create: ["db:mysql:build", "db:postgresql:build"]
  task drop: ["db:mysql:drop", "db:postgresql:drop"]
end

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


กรุณาอ้างอิงส่วนที่เกี่ยวข้องของบทความในกรณีที่มันถูกลบออก อย่าแนะนำให้ทำอะไรโดยไม่อธิบายว่าทำไม
PhilT

0

อัพเดทสำหรับ Rails 5:

db:create- สร้างฐานข้อมูลสำหรับสภาพแวดล้อมRAILS_ENVปัจจุบัน หากไม่ได้ระบุRAILS_ENVจะมีค่าเริ่มต้นสำหรับการพัฒนาและทดสอบฐานข้อมูล

db:create:all - สร้างฐานข้อมูลสำหรับทุกสภาพแวดล้อม

db:drop- ดร็อปฐานข้อมูลสำหรับสภาวะแวดล้อมRAILS_ENVปัจจุบัน หากไม่ได้ระบุRAILS_ENVจะมีค่าเริ่มต้นสำหรับการพัฒนาและทดสอบฐานข้อมูล

db:drop:all - ดร็อปฐานข้อมูลสำหรับทุกสภาพแวดล้อม

db:migrate- เรียกใช้การย้ายข้อมูลสำหรับสภาพแวดล้อมปัจจุบันที่ยังไม่ได้ทำงาน โดยค่าเริ่มต้นจะเรียกใช้การย้ายข้อมูลในสภาพแวดล้อมการพัฒนาเท่านั้น

db:migrate:redo- รันdb: migrate: downและdb: migrate: upหรือdb: migrate: rollbackและdb: migrate: upขึ้นอยู่กับการโอนย้ายที่ระบุ

db:migrate:up - รันค่าสูงสุดสำหรับการย้ายข้อมูลรุ่นที่กำหนด

db:migrate:down - วิ่งลงสำหรับรุ่นโยกย้ายที่กำหนด

db:migrate:status - แสดงสถานะการโยกย้ายปัจจุบัน

db:migrate:rollback - ย้อนกลับการโยกย้ายครั้งล่าสุด

db:version - พิมพ์เวอร์ชันสกีมาปัจจุบัน

db:forward - เพิ่มสคีมาเป็นเวอร์ชันถัดไป

db:seed- รันDB / seeds.rbไฟล์

db:schema:loadสร้างฐานข้อมูลจากไฟล์schema.rbอีกครั้ง

db:schema:dumpทิ้งสคีสภาพแวดล้อมในปัจจุบันที่จะDB / schema.rb

db:structure:load- สร้างฐานข้อมูลใหม่จากไฟล์structure.sql

db:structure:dump- ทิ้งสคีสภาพแวดล้อมในปัจจุบันที่จะDB / structure.sql (คุณสามารถระบุไฟล์อื่นด้วยSCHEMA=db/my_structure.sql)

db:setupวิ่งdb: สร้าง , DB: คีมา: โหลดและฐานข้อมูล: เมล็ดพันธุ์

db:resetวิ่งdb: ลดลงและฐานข้อมูล: การติดตั้ง db:migrate:reset- ทำงานฐานข้อมูล: ลดลง , DB: สร้างและฐานข้อมูล: โยกย้าย

db:test:prepare- ตรวจสอบการย้ายข้อมูลที่ค้างอยู่และโหลดสคีมาทดสอบ (ถ้าคุณเรียกใช้เรคโดยไม่มีข้อโต้แย้งใด ๆ มันจะทำตามค่าเริ่มต้น)

db:test:clone - สร้างฐานข้อมูลทดสอบจากสคีมาฐานข้อมูลสภาพแวดล้อมปัจจุบัน

db:test:clone_structure- คล้ายกับdb: test: cloneแต่จะให้แน่ใจว่าฐานข้อมูลการทดสอบของคุณมีโครงสร้างเดียวกันรวมถึง charsets และ collations เป็นฐานข้อมูลสภาพแวดล้อมปัจจุบันของคุณ

db:environment:set- ตั้งค่าสภาพแวดล้อมRAILS_ENVปัจจุบันในตารางar_internal_metadata (ใช้เป็นส่วนหนึ่งของการตรวจสอบสภาพแวดล้อมที่มีการป้องกัน)

db:check_protected_environments- ตรวจสอบว่าสามารถทำการกระทำการทำลายล้างในสภาพแวดล้อมRAILS_ENVปัจจุบันได้หรือไม่ ใช้ภายในเมื่อใช้การกระทำที่ก่อให้เกิดอันตรายเช่นฐานข้อมูล: ลดลงหรือฐานข้อมูล: คีมา: โหลด

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.