
TL ؛ DR يرجى نقل كود ترحيل البيانات إلى مهام Rake أو استخدام الأحجار الكريمة بنمط المخطط الكامل. غط هذا المنطق بالاختبارات.
أنا أعمل كمطور خلفية في FunBox. بالنسبة لعدد من المشاريع ، نكتب خلفية Ruby On Rails. نحن نسعى جاهدين لبناء عمليات تطوير مناسبة ، لذلك عندما نواجه مشكلة ما ، نحاول فهمها ووضع توصيات منهجية. لذلك حدث ذلك مع مشكلة ترحيل البيانات. بمجرد أن أقوم بترحيل البيانات في مهمة Rake منفصلة تمت تغطيتها بالاختبارات ، وكان لدى الفريق سؤال: "لماذا ليس في ترحيل المخطط؟" سألت المطورين في الدردشة الداخلية ، ولدهشتي كثيرًا ، كانت الآراء منقسمة. اتضح أن السؤال غامض ويستحق التحليل والمقال بعمق. سيتم تحقيق الحد الأقصى لبرنامج الأهداف لكل مقال بالنسبة لي عندما يستشهد شخص ما برابط لهذا النص في مراجعة التعليمات البرمجية ردًا على السؤال عن سبب استبعاد ترحيل بيانات معين أو على العكس من ذلك ، لم يتم إزالته من ترحيل المخطط.
استطرادا غنائي
IT . Ruby, - . , , . , : , , , , , , .
, , . , , , , .
— , (views), , . .
— (, , , .) . . , . CI, , ( ) SQL , .
— . , DML- UPDATE SQL. . .
(Continuous Delivery) — , .
Rails , , DDL-. , . , Rails omakase- . , .
, , . , . , , . .
. , . (, ) , .
, . . -, , .
deadlocks .
, , , Zero Downtime Migrations Strong Migrations.
— DSL (Domain Specific Language) Ruby DDL- SQL . DSL, , . , .
DSL, , SRP. . , , …
( , )
Ruby On Rails Data Migration , . , . Rails-, . .
SQL ORM ActiveRecord.
:
- . .
- , .
- callbacks , .
«» . , .
# db/migrate/20100513121110_add_flag_to_product.rb
class AddFlagToProduct < ActiveRecord::Migration
class Product < ActiveRecord::Base
end
def change
add_column :products, :flag, :boolean
Product.reset_column_information
Product.all.each do |product|
product.update_attributes!(:flag => false)
end
end
end
.
, each find_each c batch-.
SQL
, , SQL, :
- , . , , , (SQL), .
- JOIN-, , .
- , deadlock.
,
, .
, nullable- .
, .
, :
UPDATE table SET field = 'f' WHERE field IS NULL
:
class ClientDemandsMakeApprovedNullable < ActiveRecord::Migration
def up
change_column_null :client_demands, :approved, true
change_column_default :client_demands, :approved, nil
end
def down
execute("UPDATE client_demands SET approved = 'f' WHERE approved IS NULL")
change_column_null :client_demands, :approved, false
change_column_default :client_demands, :approved, false
end
end
, . , , . Dan Mayer Managing DB Schema & Data Changes Modifying Large Tables.
. «», . . , , , .
, .
, , .
, . . REPL .
, :
- ;
- ;
- .
. , . . .
, , , , .
Rake-
, — Rake-. . -.
Rake- . , . . . — .
, , Rake, Thoughtbot:
# lib/tasks/temporary/users.rake
namespace :users do
desc "Actualize achievements counter cache"
task actualize_achievements_counter_cache: :environment do
# C (ActiveRelation)
users = User.with_achievements
#
puts "Going to update #{users.count} users"
# , ,
# .
ActiveRecord::Base.transaction do
# Batch- find_each
users.find_each do |user|
#
user.actualize_achievements_counter_cache!
#
print "."
end
end
puts "Done!"
end
end
each find_each, . memory bloats. Akshay Mohite.
. , Rake- .
, . . , , . .
Mark Qualie up, . «» . :
class AddLastSmiledAtColumnToUsers < ActiveRecord::Migration[5.1]
def change
add_column :users, :last_smiled_at, :datetime
add_index :users, :last_smiled_at
end
class Data
def up
User.all.find_in_batches(batch_size: 250).each do |group|
ActiveRecord::Base.transaction do
group.each do |user|
user.last_smiled_at = user.smiles.last.created_at
user.save if user.changed?
end
end
end
end
end
end
:
Dir.glob("#{Rails.root}/db/migrate/*.rb").each { |file| require file }
AddLastSmiledAtColumnToUsers::Data.new.up
Job, .
, - , .
, , .
, . , .
data-migrate (> 670), , Readme. Rails 5+.
, Rails 4+:
rails-data-migrations(> 93 )
nonschema_migrations(> 53 )
. .
, Rake-. . , .
db/data, db/migrate c :
rails g data_migration add_this_to_that
:
rake data:migrate
rake db:migrate:with_data
rake db:rollback:with_data
rake db:migrate:status:with_data
, .
| Rails | Rake | ||||
|---|---|---|---|---|---|
| + | - | - | - | - | |
| Zero Downtime Deployment | - | + | + | + | + |
| Test First | - | - | + | + | |
| + | - | - | + | ||
| + | - | + | + | + | |
| + | - | - | + | + |
.
— , :
- — ;
- Zero Downtime Deployment — , ;
- Test First — ;
- — ;
- — , ;
- — , , .
, Rake- — .
, . .
, — , . , .
- Rails Guides.
- Thoughtbot. Data Migrations in Rails.
- AtomicObject. Testing Data Migrations in Rails.
- Marcqualie. Rails Data Migrations.
- Ombulabs. Three Useful Data Migration Patterns for Rails.
- Strong Migrations.
- Zero Downtime Migrations.
- Dan Mayer. Managing DB Schema & Data Change.
Akshay Mohite find_eacheach.- . « . ». 1, 8 . , , .
UPD 2020-08-06: Extrapolator « ».
- , Test First .
.
UPD 2020-08-07: . , . . , .