Ruby on Rails
ActiveRecord माइग्रेशन
खोज…
पैरामीटर
स्तंभ प्रकार | विवरण |
---|---|
:primary_key | प्राथमिक कुंजी |
:string | छोटा स्ट्रिंग डेटाटाइप। अधिकतम वर्णों के लिए limit विकल्प की अनुमति देता limit । |
:text | पाठ की लंबी राशि। अधिकतम बाइट्स के लिए limit विकल्प की अनुमति देता limit । |
:integer | पूर्णांक। अधिकतम बाइट्स के लिए limit विकल्प की अनुमति देता limit । |
:bigint | बड़ा पूर्णांक |
:float | फ्लोट |
:decimal | परिवर्तनीय परिशुद्धता के साथ दशमलव संख्या। precision और scale विकल्पों की अनुमति देता है। |
:numeric | precision और scale विकल्पों की अनुमति देता है। |
:datetime | दिनांक / समय के लिए DateTime ऑब्जेक्ट। |
:time | समय वस्तु समय के लिए। |
:date | दिनांक के लिए दिनांक ऑब्जेक्ट। |
:binary | बाइनरी डेटा। अधिकतम बाइट्स के लिए limit विकल्प की अनुमति देता limit । |
:boolean | बूलियन |
टिप्पणियों
अधिकांश माइग्रेशन फ़ाइलें
db/migrate/
निर्देशिका में रहती हैं। वे अपने फ़ाइल नाम की शुरुआत में एक UTC टाइमस्टैम्प द्वारा पहचाने जाते हैं:YYYYMMDDHHMMSS_create_products.rb
।rails generate
कमांडrails g
को छोटा किया जा सकता है।यदि a
:type
को किसी फ़ील्ड में पास नहीं किया जाता है, तो यह स्ट्रिंग को डिफॉल्ट करता है।
विशिष्ट माइग्रेशन चलाएं
एक विशिष्ट माइग्रेशन को ऊपर या नीचे चलाने के लिए, db:migrate:up
या db:migrate:down
।
एक विशिष्ट प्रवासन तक:
rake db:migrate:up VERSION=20090408054555
rails db:migrate:up VERSION=20090408054555
नीचे एक विशिष्ट प्रवासन:
rake db:migrate:down VERSION=20090408054555
rails db:migrate:down VERSION=20090408054555
उपरोक्त आदेशों में संस्करण संख्या माइग्रेशन के फ़ाइल नाम में संख्यात्मक उपसर्ग है। उदाहरण के लिए, माइग्रेशन 20160515085959_add_name_to_users.rb
पर माइग्रेट करने के लिए, आप संस्करण संख्या के रूप में 20160515085959
उपयोग करेंगे।
ज्वाइन टेबल बनाएं
students
और courses
बीच एक सम्मिलित तालिका बनाने के लिए, कमांड चलाएँ:
$ rails g migration CreateJoinTableStudentCourse student course
यह निम्नलिखित माइग्रेशन उत्पन्न करेगा:
class CreateJoinTableStudentCourse < ActiveRecord::Migration[5.0]
def change
create_join_table :students, :courses do |t|
# t.index [:student_id, :course_id]
# t.index [:course_id, :student_id]
end
end
end
विभिन्न वातावरणों में पलायन
test
वातावरण में माइग्रेशन चलाने के लिए, इस शेल कमांड को चलाएं:
rake db:migrate RAILS_ENV=test
रेल 5.0 में शुरू, आप rake
बजाय rails
उपयोग कर सकते हैं:
rails db:migrate RAILS_ENV=test
तालिका में एक नया कॉलम जोड़ें
users
तालिका में एक नया कॉलम name
जोड़ने के लिए, कमांड चलाएँ:
rails generate migration AddNameToUsers name
यह निम्नलिखित माइग्रेशन उत्पन्न करता है:
class AddNameToUsers < ActiveRecord::Migration[5.0]
def change
add_column :users, :name, :string
end
end
जब माइग्रेशन नाम AddXXXToTABLE_NAME
फॉर्म का AddXXXToTABLE_NAME
जिसके बाद डेटा प्रकारों के साथ कॉलम की सूची होती है, तो उत्पन्न माइग्रेशन में उपयुक्त add_column
स्टेटमेंट होंगे।
एक इंडेक्स के साथ एक नया कॉलम जोड़ें
users
तालिका में एक नया अनुक्रमित स्तंभ email
जोड़ने के लिए, कमांड चलाएँ:
rails generate migration AddEmailToUsers email:string:index
यह निम्नलिखित माइग्रेशन उत्पन्न करेगा:
class AddEmailToUsers < ActiveRecord::Migration[5.0]
def change
add_column :users, :email, :string
add_index :users, :email
end
end
किसी मौजूदा स्तंभ को किसी तालिका से निकालें
users
तालिका से मौजूदा स्तंभ name
को निकालने के लिए, कमांड चलाएँ:
rails generate migration RemoveNameFromUsers name:string
यह निम्नलिखित माइग्रेशन उत्पन्न करेगा:
class RemoveNameFromUsers < ActiveRecord::Migration[5.0]
def change
remove_column :users, :name, :string
end
end
जब माइग्रेशन नाम फॉर्म का होता है RemoveXXXFromYYY
इसके बाद डेटा प्रकारों के साथ कॉलम की सूची होती है तो उत्पन्न माइग्रेशन में उपयुक्त remove_column
स्टेटमेंट होंगे।
हालांकि इसे remove_column
लिए एक पैरामीटर के रूप में डेटा प्रकार (जैसे :string
) को निर्दिष्ट करने की आवश्यकता नहीं है, यह अत्यधिक अनुशंसित है। यदि डेटा प्रकार निर्दिष्ट नहीं है, तो माइग्रेशन प्रतिवर्ती नहीं होगा।
एक तालिका में एक संदर्भ स्तंभ जोड़ें
users
तालिका में एक team
का संदर्भ जोड़ने के लिए, यह कमांड चलाएँ:
$ rails generate migration AddTeamRefToUsers team:references
यह निम्नलिखित माइग्रेशन उत्पन्न करता है:
class AddTeamRefToUsers < ActiveRecord::Migration[5.0]
def change
add_reference :users, :team, foreign_key: true
end
end
वह माइग्रेशन users
तालिका में एक team_id
कॉलम बनाएगा।
यदि आप जोड़े गए कॉलम पर एक उपयुक्त index
और foreign_key
जोड़ना चाहते हैं, तो कमांड को rails generate migration AddTeamRefToUsers team:references:index
। यह निम्नलिखित माइग्रेशन उत्पन्न करेगा:
class AddTeamRefToUsers < ActiveRecord::Migration
def change
add_reference :users, :team, index: true
add_foreign_key :users, :teams
end
end
यदि आप अपने संदर्भ कॉलम को नामांकित करना चाहते हैं, तो इसके अलावा अन्य क्या नाम हैं जो ऑटो उत्पन्न करता है, अपने माइग्रेशन में निम्न जोड़ें: (उदाहरण के लिए: आप Post
टेबल में Author
रूप में Post
User
को कॉल करना चाहते हैं)
class AddAuthorRefToPosts < ActiveRecord::Migration
def change
add_reference :posts, :author, references: :users, index: true
end
end
एक नई तालिका बनाएँ
कॉलम name
और salary
साथ एक नया users
तालिका बनाने के लिए, कमांड चलाएँ:
rails generate migration CreateUsers name:string salary:decimal
यह निम्नलिखित माइग्रेशन उत्पन्न करेगा:
class CreateUsers < ActiveRecord::Migration[5.0]
def change
create_table :users do |t|
t.string :name
t.decimal :salary
end
end
end
जब माइग्रेशन नाम फॉर्म का होता है CreateXXX
जिसके बाद डेटा प्रकारों के साथ कॉलम की सूची होती है, तो एक माइग्रेशन उत्पन्न होगा जो सूचीबद्ध स्तंभों के साथ तालिका XXX
बनाता है।
एक तालिका में कई कॉलम जोड़ना
एक तालिका में कई कॉलम जोड़ने के लिए, अलग field:type
rails generate migration
साथ जोड़े field:type
जब rails generate migration
का उपयोग rails generate migration
कमांड rails generate migration
।
सामान्य वाक्यविन्यास है:
rails generate migration NAME [field[:type][:index] field[:type][:index]] [options]
उदाहरण के लिए, निम्न users
तालिका में name
, salary
और email
फ़ील्ड जोड़ देगा:
rails generate migration AddDetailsToUsers name:string salary:decimal email:string
जो निम्नलिखित प्रवास उत्पन्न करता है:
class AddDetailsToUsers < ActiveRecord::Migration[5.0]
def change
add_column :users, :name, :string
add_column :users, :salary, :decimal
add_column :users, :email, :string
end
end
पलायन चल रहा है
चलाने के आदेश:
rake db:migrate
rails db:migrate
निर्दिष्ट लक्ष्य संस्करण तब तक आवश्यक माइग्रेशन (ऊपर, नीचे, परिवर्तन) चलाएगा, जब तक कि वह निर्दिष्ट संस्करण तक नहीं पहुंच जाता। यहां, version number
माइग्रेशन के फ़ाइल नाम पर संख्यात्मक उपसर्ग है।
rake db:migrate VERSION=20080906120000
rails db:migrate VERSION=20080906120000
रोलबैक माइग्रेशन
नवीनतम माइग्रेशन को rollback
करने के लिए, या तो change
विधि को change
या down
विधि को चलाकर। चलाने के आदेश:
rake db:rollback
rails db:rollback
रोलबैक अंतिम 3 माइग्रेशन
rake db:rollback STEP=3
rails db:rollback STEP=3
STEP
वापस करने के लिए माइग्रेशन की संख्या प्रदान करते हैं।
रोलबैक सभी माइग्रेशन
rake db:rollback VERSION=0
rails db:rollback VERSION=0
टेबल्स बदलना
यदि आपने कुछ गलत स्कीमा के साथ एक तालिका बनाई है, तो कॉलम और उनके गुणों को बदलने का सबसे आसान तरीका change_table
। निम्नलिखित उदाहरण की समीक्षा करें:
change_table :orders do |t|
t.remove :ordered_at # removes column ordered_at
t.string :skew_number # adds a new column
t.index :skew_number #creates an index
t.rename :location, :state #renames location column to state
end
उपरोक्त माइग्रेशन एक टेबल orders
बदलता है। यहां परिवर्तनों का एक पंक्ति-दर-पंक्ति वर्णन है:
-
t.remove :ordered_at
टेबलorders
से कॉलमordered_at
गए कॉलम को हटा देता है। -
t.string :skew_number
orders
तालिका मेंskew_number
नामक एक नया स्ट्रिंग-प्रकार कॉलम जोड़ता है। -
t.index :skew_number
orders
तालिका मेंskew_number
कॉलम पर एक इंडेक्स जोड़ता है। -
t.rename :location, :state
का नाम बदलताlocation
में स्तंभorders
करने के लिए तालिकाstate
।
तालिका में एक अद्वितीय स्तंभ जोड़ें
users
लिए एक नया अनूठा कॉलम email
जोड़ने के लिए users
निम्नलिखित कमांड चलाएँ:
rails generate migration AddEmailToUsers email:string:uniq
यह निम्नलिखित प्रवास पैदा करेगा:
class AddEmailToUsers < ActiveRecord::Migration[5.0]
def change
add_column :users, :email, :string
add_index :users, :email, unique: true
end
end
किसी मौजूदा कॉलम का प्रकार बदलें
किसी मौजूदा कॉलम को माइग्रेशन के साथ रेल में संशोधित करने के लिए, निम्न कमांड चलाएँ:
rails g migration change_column_in_table
यह db/migration
डायरेक्टरी (यदि यह पहले से मौजूद नहीं है) में एक नई माइग्रेशन फ़ाइल बनाएगा, जिसमें टाइमस्टैम्प और माइग्रेशन फ़ाइल नाम के साथ उपसर्गित फ़ाइल होगी जिसमें नीचे दी गई सामग्री होगी:
def change
change_column(:table_name, :column_name, :new_type)
end
एक लंबी लेकिन सुरक्षित विधि
उपरोक्त कोड उपयोगकर्ता को कभी भी माइग्रेशन को वापस करने से रोकता है। आप बंटवारे से इस समस्या से बचने कर सकते हैं change
अलग में विधि up
और down
तरीके:
def up
change_column :my_table, :my_column, :new_type
end
def down
change_column :my_table, :my_column, :old_type
end
पुनः माइग्रेशन
आप रोलबैक कर सकते हैं और फिर विस्थापित फिर से उपयोग redo
आदेश। यह मूल रूप से एक शॉर्टकट है जो rollback
और migrate
कार्यों को जोड़ता है।
चलाने के आदेश:
rake db:migrate:redo
rails db:migrate:redo
आप एक से अधिक संस्करण वापस जाने के लिए STEP
पैरामीटर का उपयोग कर सकते हैं।
उदाहरण के लिए, 3 माइग्रेशन वापस जाने के लिए:
rake db:migrate:redo STEP=3
rails db:migrate:redo STEP=3
डिफ़ॉल्ट मान के साथ कॉलम जोड़ें
निम्न उदाहरण users
तालिका में एक स्तंभ admin
जोड़ता है, और उस स्तंभ को डिफ़ॉल्ट मान false
।
class AddDetailsToUsers < ActiveRecord::Migration[5.0]
def change
add_column :users, :admin, :boolean, default: false
end
end
चूक के साथ माइग्रेशन बड़ी तालिका में लंबे समय तक ले सकता है उदाहरण के लिए PostgreSQL। ऐसा इसलिए है क्योंकि प्रत्येक पंक्ति को नए जोड़े गए कॉलम के लिए डिफ़ॉल्ट मान के साथ अपडेट करना होगा। इसे रोकने के लिए (और परिनियोजन के दौरान डाउनटाइम को कम करने के लिए), आप अपने माइग्रेशन को तीन चरणों में विभाजित कर सकते हैं:
- ऊपर दिए गए एक के समान एक
add_column
माइग्रेशन जोड़ें, लेकिन कोई डिफ़ॉल्ट सेट न करें - जब आपका ऐप चल रहा हो तो कॉलम को रेक कार्य में या कंसोल पर अपडेट करें। सुनिश्चित करें कि आपका एप्लिकेशन पहले से ही नई / अपडेट की गई पंक्तियों के लिए उस कॉलम में डेटा लिखता है।
- एक और
change_column
माइग्रेशन जोड़ें, जो उस कॉलम के डिफ़ॉल्ट को वांछित डिफ़ॉल्ट मान में बदलता है
निषिद्ध शून्य मान
अपने टेबल कॉलम में null
मानों को रोकने के लिए, अपने माइग्रेशन में :null
पैरामीटर जोड़ें, जैसे:
class AddPriceToProducts < ActiveRecord::Migration
def change
add_column :products, :float, null: false
end
end
प्रवासन की स्थिति की जाँच करना
हम चल कर पलायन की स्थिति की जाँच कर सकते हैं
rake db:migrate:status
rails db:migrate:status
आउटपुट इस तरह दिखेगा:
Status Migration ID Migration Name
--------------------------------------------------
up 20140711185212 Create documentation pages
up 20140724111844 Create nifty attachments table
up 20140724114255 Create documentation screenshots
up 20160213170731 Create owners
up 20160218214551 Create users
up 20160221162159 ********** NO FILE **********
up 20160222231219 ********** NO FILE **********
स्टेटस फील्ड के तहत, up
मतलब माइग्रेशन चला गया है और down
मतलब है कि हमें माइग्रेशन चलाने की जरूरत है।
एक स्तंभ स्तंभ बनाएँ
सेटिंग्स को स्टोर करने के लिए Hstore
कॉलम उपयोगी हो सकते हैं। एक्सटेंशन सक्षम करने के बाद वे PostgreSQL डेटाबेस में उपलब्ध हैं।
class CreatePages < ActiveRecord::Migration[5.0]
def change
create_table :pages do |t|
enable_extension 'hstore' unless extension_enabled?('hstore')
t.hstore :settings
t.timestamps
end
end
end
एक आत्म संदर्भ जोड़ें
एक स्व-संदर्भ एक पदानुक्रमित पेड़ बनाने के लिए उपयोगी हो सकता है। यह एक माइग्रेशन में add_reference
साथ प्राप्त किया जा सकता है।
class AddParentPages < ActiveRecord::Migration[5.0]
def change
add_reference :pages, :pages
end
end
विदेशी कुंजी कॉलम pages_id
होगा। यदि आप विदेशी कुंजी कॉलम नाम के बारे में निर्णय लेना चाहते हैं, तो आपको पहले कॉलम बनाना होगा और उसके बाद संदर्भ जोड़ना होगा।
class AddParentPages < ActiveRecord::Migration[5.0]
def change
add_column :pages, :parent_id, :integer, null: true, index: true
add_foreign_key :pages, :pages, column: :parent_id
end
end
एक सरणी कॉलम बनाएं
एक array
स्तंभ PostgreSQL द्वारा समर्थित है। रेल स्वचालित रूप से एक PostgreSQL सरणी को रूबी सरणी में बदल देगी, और इसके विपरीत।
एक array
कॉलम के साथ एक तालिका बनाएं:
create_table :products do |t|
t.string :name
t.text :colors, array: true, default: []
end
मौजूदा तालिका में एक array
कॉलम जोड़ें:
add_column :products, :colors, array: true, default: []
एक array
कॉलम के लिए एक सूचकांक जोड़ें:
add_index :products, :colors, using: 'gin'
मौजूदा डेटा में एक नहीं पूर्ण बाधा जोड़ना
कहते हैं कि आप एक विदेशी कुंजी company_id
को users
तालिका में जोड़ना चाहते हैं, और आप उस पर एक NOT NULL
बाधा NOT NULL
company_id
चाहते हैं। यदि आपके पास पहले से ही users
में डेटा है, तो आपको इसे कई चरणों में करना होगा।
class AddCompanyIdToUsers < ActiveRecord::Migration
def up
# add the column with NULL allowed
add_column :users, :company_id, :integer
# make sure every row has a value
User.find_each do |user|
# find the appropriate company record for the user
# according to your business logic
company = Company.first
user.update!(company_id: company.id)
end
# add NOT NULL constraint
change_column_null :users, :company_id, false
end
# Migrations that manipulate data must use up/down instead of change
def down
remove_column :users, :company_id
end
end