ฉันพยายามเรียกใช้การย้ายข้อมูลเพียงครั้งเดียวจากทั้งกลุ่มในแอปทางรถไฟของฉัน ฉันจะทำเช่นนี้ได้อย่างไร? ฉันไม่ต้องการเรียกใช้การย้ายข้อมูลใด ๆ ก่อนหรือหลังการย้ายข้อมูล ขอบคุณ.
ฉันพยายามเรียกใช้การย้ายข้อมูลเพียงครั้งเดียวจากทั้งกลุ่มในแอปทางรถไฟของฉัน ฉันจะทำเช่นนี้ได้อย่างไร? ฉันไม่ต้องการเรียกใช้การย้ายข้อมูลใด ๆ ก่อนหรือหลังการย้ายข้อมูล ขอบคุณ.
คำตอบ:
rake db:migrate:redo VERSION=xxxxxxx
แต่จะเรียกใช้down
แล้วup
ขั้นตอน คุณสามารถทำได้ร่วมกับการแสดงความคิดเห็นในขั้นตอนลงชั่วคราว
rake -T
.
db:test:prepare
ยังไม่ปรากฏในรายการนั้น พระเจ้าฉันมาสายไปงานปาร์ตี้
rake db:migrate:up VERSION=my_version
อาจไม่ต้องทำอะไรเลยเนื่องจากตาราง schema_migrations ยังคงระบุว่ามีการรัน ในสถานการณ์เดียวกันrake db:migrate:redo VERSION=my_version
อาจล้มเหลวเนื่องจากไม่สามารถวางโต๊ะได้ ในกรณีนี้ให้แสดงความคิดเห็นเกี่ยวกับdown
วิธีการในการย้ายข้อมูลชั่วคราวและเรียกใช้ใหม่rake db:migrate:redo...
rake db:migrate:up VERSION=1234567890
ในทำนองเดียวกันrake db:migrate:down
กับการย้ายข้อมูลที่เฉพาะเจาะจงลง rake -T
คุณจะได้รับรายการของงานคราดสามารถใช้ได้กับ
VERSION
กล่าวถึงนี้เป็นค่าจำนวนเต็มที่จุดเริ่มต้นของไฟล์การย้ายข้อมูลแต่ละไฟล์ของคุณ (ซึ่งเป็นเพียงการประทับเวลาของเวลาที่สร้าง) ตัวอย่างเช่น VERSION=20150720023630
.
VERSION
เป็นเพียงตัวแปรสภาพแวดล้อมดังนั้นจึงสามารถมาก่อนในคำสั่งหรือแม้แต่ตั้งค่าก่อนหน้าคำสั่ง:VERSION=1234567890 rake db:migrate:up
ฉันต้องเรียกใช้การย้ายข้อมูลเพียงครั้งเดียวซึ่งมีการเปลี่ยนแปลงและจำเป็นต้องเรียกใช้ใหม่โดยไม่ขึ้นกับการย้ายข้อมูลอื่น ๆ ทั้งหมด เปิดคอนโซลแล้วทำสิ่งนี้:
>> require 'db/migrate/your_migrations.rb'
=> ["YourMigrations"]
>> YourMigrations.up
=> etc... as the migration runs
>> YourMigration.down
มีประโยชน์มากขึ้นสิ่งนี้สามารถนำไปใช้ในงานคราดเป็นต้น
change
ให้รันYourMigrations.migrate(:up)
แทน (หรือ:down
ด้วย!)
require "#{Rails.root}/db/migrate/your_migrations.rb"
rake db:migrate:up VERSION=version_no
จะโอนย้าย (เพิ่ม) สคริปต์การโอนย้ายเฉพาะ
rake db:migrate:down VERSION=version_no
จะลบสคริปต์การย้ายข้อมูลเฉพาะ
rake db:migrate VERSION=20098252345
ลองดูสิ
VERSION
เป็นเพียงตัวแปรสภาพแวดล้อมดังนั้นจึงสามารถมาก่อนในคำสั่งหรือแม้กระทั่งตั้งค่าก่อนหน้าคำสั่ง:VERSION=20098252345 rake db:migrate
rake db:migrate:redo version='xxxx'
อย่าลืมใส่เครื่องหมายคำพูดรอบ xxxx, xxxx คือการประทับเวลา (หรือรหัสการย้ายข้อมูล) สำหรับการย้ายข้อมูลของคุณ
คุณสามารถตรวจสอบการประทับเวลา (ID การย้ายข้อมูล) สำหรับการย้ายข้อมูลก่อนหน้านี้ที่คุณเคยทำโดยใช้
rake db:migrate:status
การขยายคำตอบโดย korch ข้างต้นrequire
ไม่ได้ผลสำหรับฉัน แต่load
ทำ เพื่อให้เป็นรูปธรรมสำหรับไฟล์การโยกย้าย:
class ChangeMinQuantityToRaces < ActiveRecord::Migration
def change
change_column :races, :min_quantity, :integer, :default => 0
end
end
ในคอนโซลการพิมพ์
> load 'db/migrate/30130925110821_change_min_quantity_to_races.rb'
> ChangeMinQuantityToRaces.new.change
ทำงานให้ฉัน
> Race.new.min_quantity # => 0
นี่คือสำหรับ Ruby 1.9.3p484 (2013-11-22 revision 43786) [x86_64-linux] และ Rails 3.2.13
การเพิ่ม 2 ¢ของฉันลงในสิ่งนี้เนื่องจากฉันพบปัญหาเดียวกันนี้:
หากคุณต้องการเรียกใช้การย้ายข้อมูลซ้ำอีกครั้งโดยไม่ต้องสร้างขึ้นมาใหม่คุณสามารถดำเนินการดังต่อไปนี้:
rails dbconsole -p
devdb=# delete from public.schema_migrations where version = '20150105181157';
และรางจะ "ลืม" ว่ารันการย้ายข้อมูลสำหรับ 20150105181157 ตอนนี้เมื่อคุณเรียกใช้ db: migrate มันจะรันอีกครั้ง
นี่เป็นความคิดที่ไม่ดีเกือบตลอดเวลา ตัวอย่างหนึ่งที่สมเหตุสมผลคือถ้าคุณมีสาขาการพัฒนาและคุณยังไม่ได้ดำเนินการโยกย้ายและต้องการเพิ่มบางอย่างในการพัฒนา แต่ถึงอย่างนั้นก็เป็นการดีกว่าที่จะทำการย้ายข้อมูลแบบ 2 ทางเพื่อให้คุณสามารถย้อนกลับและลองใหม่ซ้ำ ๆ ได้อย่างเหมาะสม
ต้องมีวิธีเรียกใช้คลาสการโยกย้ายผ่านคอนโซล ดูเหมือนว่าฉันไม่สามารถรับรหัสการย้ายข้อมูลให้จดจำได้
อย่างไรก็ตามตามความคิดเห็นที่ระบุควรเรียกใช้การย้ายข้อมูลตามลำดับ ใช้:
rake db:migrate VERSION=##########
คัดลอกและวางรหัสของคุณในการย้ายไปยังสคริปต์ / คอนโซล?
ฉันมีวิธียูทิลิตี้ที่ทำให้การพัฒนานี้ง่ายมาก ฉันพบว่าช่วยหลีกเลี่ยงการสร้างการย้ายข้อมูลมากเกินไปโดยปกติฉันจะแก้ไขการย้ายข้อมูลจนกว่าจะมีการปรับใช้
http://fullware.net/index.php/2011/05/26/easily-load-rails-migrations-for-console-execution/
ฉันใช้เทคนิคนี้ในการพัฒนาเมื่อฉันเปลี่ยนการย้ายข้อมูลเป็นจำนวนมากและฉันไม่ต้องการย้ายข้อมูลจำนวนมากและสูญเสียข้อมูลใด ๆ ในระหว่างทาง (โดยเฉพาะอย่างยิ่งเมื่อฉันนำเข้าข้อมูลเดิมที่ใช้เวลานาน ฉันไม่ต้องการนำเข้าใหม่อีกครั้ง)
นี่เป็นการแฮ็ก 100% และฉันไม่แนะนำให้ทำสิ่งนี้ในการผลิตอย่างแน่นอน แต่จะทำเคล็ดลับ:
STEP=n
อาร์กิวเมนต์ให้db:migrate
(n
จำนวนการย้ายข้อมูลที่จะรันอยู่ที่ไหนเช่นเดียวกับที่มีdb:rollback
) - จากนั้นคุณสามารถทำได้rake db:migrate STEP=1
หรือrake db:migrate STEP=2
อื่น ๆ