ทำการโยกย้ายเพียงครั้งเดียว


96

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


2
นี่จะเป็นคุณลักษณะทางรถไฟที่สะดวก: เพิ่มSTEP=nอาร์กิวเมนต์ให้db:migrate( nจำนวนการย้ายข้อมูลที่จะรันอยู่ที่ไหนเช่นเดียวกับที่มีdb:rollback) - จากนั้นคุณสามารถทำได้rake db:migrate STEP=1หรือrake db:migrate STEP=2อื่น ๆ
user664833

คำตอบ:


165

rake db:migrate:redo VERSION=xxxxxxxแต่จะเรียกใช้downแล้วupขั้นตอน คุณสามารถทำได้ร่วมกับการแสดงความคิดเห็นในขั้นตอนลงชั่วคราว


อืมblog.stonean.com/2007/12/18/rake-dbmigrateredo , :: การทำซ้ำดูเหมือนจะไม่ใช้อาร์กิวเมนต์ VERSION
Terry G Lorber

3
@pedrorolo: สิ่งนี้ไม่ล้าสมัย งานนี้ไม่มีคำอธิบายและจะไม่ปรากฏในrake -T.
Ryan Bigg

1
@pedrorolo: db:test:prepareยังไม่ปรากฏในรายการนั้น พระเจ้าฉันมาสายไปงานปาร์ตี้
mraaroncruz

9
หากต้องการขยายสิ่งที่ Ryan พูดหากตารางหลุดจากฐานข้อมูลนอก Rails rake db:migrate:up VERSION=my_versionอาจไม่ต้องทำอะไรเลยเนื่องจากตาราง schema_migrations ยังคงระบุว่ามีการรัน ในสถานการณ์เดียวกันrake db:migrate:redo VERSION=my_versionอาจล้มเหลวเนื่องจากไม่สามารถวางโต๊ะได้ ในกรณีนี้ให้แสดงความคิดเห็นเกี่ยวกับdownวิธีการในการย้ายข้อมูลชั่วคราวและเรียกใช้ใหม่rake db:migrate:redo...
Leo

3
และเพื่อขยายสิ่งที่ @Leo กล่าวหากการโยกย้ายถูกกำหนดด้วยการเปลี่ยนแปลง def ให้เปลี่ยนเป็น def self.up เพิ่มเติมจากข้างต้น
valk

72
rake db:migrate:up VERSION=1234567890

ในทำนองเดียวกันrake db:migrate:downกับการย้ายข้อมูลที่เฉพาะเจาะจงลง rake -Tคุณจะได้รับรายการของงานคราดสามารถใช้ได้กับ


4
ที่VERSIONกล่าวถึงนี้เป็นค่าจำนวนเต็มที่จุดเริ่มต้นของไฟล์การย้ายข้อมูลแต่ละไฟล์ของคุณ (ซึ่งเป็นเพียงการประทับเวลาของเวลาที่สร้าง) ตัวอย่างเช่น VERSION=20150720023630.
aaron-coding

3
เวอร์ชันจะแสดงอย่างสวยงามด้วย rake db: migrate: status
jpgeek

ที่น่าสังเกตVERSIONเป็นเพียงตัวแปรสภาพแวดล้อมดังนั้นจึงสามารถมาก่อนในคำสั่งหรือแม้แต่ตั้งค่าก่อนหน้าคำสั่ง:VERSION=1234567890 rake db:migrate:up
Joshua Pinter

25

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

>> require 'db/migrate/your_migrations.rb'
=> ["YourMigrations"]
>> YourMigrations.up
=> etc... as the migration runs
>> YourMigration.down

มีประโยชน์มากขึ้นสิ่งนี้สามารถนำไปใช้ในงานคราดเป็นต้น


6
สิ่งนี้ได้ผลอย่างยอดเยี่ยม นอกจากนี้คุณยังสามารถคัดลอกและวางโค้ดจากการย้ายข้อมูลลงในคอนโซลเพื่อกำหนดคลาสได้ (ซึ่งจะช่วยให้สามารถจัดการด้วยตนเองได้หากจำเป็นหากคุณทำผิดพลาดใน Dev เป็นต้น) หากคุณกำหนดการโยกย้ายแบบย้อนกลับด้วยchangeให้รันYourMigrations.migrate(:up)แทน (หรือ:downด้วย!)
trisweb

1
คุณอาจต้องrequire "#{Rails.root}/db/migrate/your_migrations.rb"
s2t2

16

rake db:migrate:up VERSION=version_no

จะโอนย้าย (เพิ่ม) สคริปต์การโอนย้ายเฉพาะ

rake db:migrate:down VERSION=version_no

จะลบสคริปต์การย้ายข้อมูลเฉพาะ


11
rake db:migrate VERSION=20098252345

ลองดูสิ


8
ฉันคิดว่าการดำเนินการนี้จะเรียกใช้การย้ายข้อมูลตามที่คุณระบุไว้
Ken Liu

1
ปิด แต่ยังเรียกใช้การย้ายข้อมูลก่อนการย้ายข้อมูลเฉพาะ
อานนท์

6
ฉันไม่คิดว่าคุณควร / ต้องการเรียกใช้การย้ายข้อมูลเพียงครั้งเดียวโดยไม่พิจารณาถึงการย้ายข้อมูลก่อนหน้านั้น การโอนย้ายเป็นการแสดงโครงสร้างฐานข้อมูลเนื่องจากเกี่ยวข้องกับรหัส ณ ช่วงเวลาที่กำหนดดังนั้นจึงต้องทำการโอนย้ายก่อนที่จะมีความจำเป็น หากคุณต้องการเรียกใช้การย้ายข้อมูลเพียงครั้งเดียวอาจเป็นไปได้ว่าคุณไม่ได้เขียนการดำเนินการขึ้น / ลงที่เหมาะสมเพื่อให้การย้ายข้อมูลทำงานได้ ... เป็นนิสัยที่ไม่ดีในการเขียนเฉพาะการย้ายข้อมูลของคุณ
JP Silvashy

1
สิ่งที่น่าสังเกต: VERSIONเป็นเพียงตัวแปรสภาพแวดล้อมดังนั้นจึงสามารถมาก่อนในคำสั่งหรือแม้กระทั่งตั้งค่าก่อนหน้าคำสั่ง:VERSION=20098252345 rake db:migrate
Joshua Pinter

4
rake db:migrate:redo version='xxxx'   

อย่าลืมใส่เครื่องหมายคำพูดรอบ xxxx, xxxx คือการประทับเวลา (หรือรหัสการย้ายข้อมูล) สำหรับการย้ายข้อมูลของคุณ

คุณสามารถตรวจสอบการประทับเวลา (ID การย้ายข้อมูล) สำหรับการย้ายข้อมูลก่อนหน้านี้ที่คุณเคยทำโดยใช้

rake db:migrate:status    

3

การขยายคำตอบโดย 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

การเพิ่ม 2 ¢ของฉันลงในสิ่งนี้เนื่องจากฉันพบปัญหาเดียวกันนี้:

หากคุณต้องการเรียกใช้การย้ายข้อมูลซ้ำอีกครั้งโดยไม่ต้องสร้างขึ้นมาใหม่คุณสามารถดำเนินการดังต่อไปนี้:

rails dbconsole -p devdb=# delete from public.schema_migrations where version = '20150105181157';

และรางจะ "ลืม" ว่ารันการย้ายข้อมูลสำหรับ 20150105181157 ตอนนี้เมื่อคุณเรียกใช้ db: migrate มันจะรันอีกครั้ง

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


1

ต้องมีวิธีเรียกใช้คลาสการโยกย้ายผ่านคอนโซล ดูเหมือนว่าฉันไม่สามารถรับรหัสการย้ายข้อมูลให้จดจำได้

อย่างไรก็ตามตามความคิดเห็นที่ระบุควรเรียกใช้การย้ายข้อมูลตามลำดับ ใช้:

rake db:migrate VERSION=##########

คัดลอกและวางรหัสของคุณในการย้ายไปยังสคริปต์ / คอนโซล?


1

ฉันมีวิธียูทิลิตี้ที่ทำให้การพัฒนานี้ง่ายมาก ฉันพบว่าช่วยหลีกเลี่ยงการสร้างการย้ายข้อมูลมากเกินไปโดยปกติฉันจะแก้ไขการย้ายข้อมูลจนกว่าจะมีการปรับใช้

http://fullware.net/index.php/2011/05/26/easily-load-rails-migrations-for-console-execution/


0

ฉันใช้เทคนิคนี้ในการพัฒนาเมื่อฉันเปลี่ยนการย้ายข้อมูลเป็นจำนวนมากและฉันไม่ต้องการย้ายข้อมูลจำนวนมากและสูญเสียข้อมูลใด ๆ ในระหว่างทาง (โดยเฉพาะอย่างยิ่งเมื่อฉันนำเข้าข้อมูลเดิมที่ใช้เวลานาน ฉันไม่ต้องการนำเข้าใหม่อีกครั้ง)

นี่เป็นการแฮ็ก 100% และฉันไม่แนะนำให้ทำสิ่งนี้ในการผลิตอย่างแน่นอน แต่จะทำเคล็ดลับ:

  1. ย้ายการย้ายข้อมูลที่คุณต้องการเรียกใช้อีกครั้งจากไดเร็กทอรีไปยังที่ชั่วคราว
  2. สร้างการย้ายข้อมูลอื่นโดยใช้ชื่อเดียวกัน
  3. คัดลอก / วางรหัสการย้ายข้อมูลเดิมลงในไฟล์การย้ายข้อมูลที่สร้างขึ้นใหม่
  4. เรียกใช้การย้ายข้อมูลใหม่
  5. ลบไฟล์การย้ายข้อมูลที่สร้างขึ้นใหม่
  6. แก้ไขการย้ายข้อมูลสคีมาของคุณเพื่อลบค่าล่าสุด
  7. กู้คืนไฟล์การย้ายข้อมูลเก่า
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.