खोज…


पैरामीटर

स्तंभ प्रकार विवरण
: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

एक विशिष्ट प्रवासन तक:

5.0
rake db:migrate:up VERSION=20090408054555
5.0
rails db:migrate:up VERSION=20090408054555 

नीचे एक विशिष्ट प्रवासन:

5.0
rake db:migrate:down VERSION=20090408054555
5.0
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

रेल 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

पलायन चल रहा है

चलाने के आदेश:

5.0
rake db:migrate
5.0
rails db:migrate

निर्दिष्ट लक्ष्य संस्करण तब तक आवश्यक माइग्रेशन (ऊपर, नीचे, परिवर्तन) चलाएगा, जब तक कि वह निर्दिष्ट संस्करण तक नहीं पहुंच जाता। यहां, version number माइग्रेशन के फ़ाइल नाम पर संख्यात्मक उपसर्ग है।

5.0
rake db:migrate VERSION=20080906120000
5.0
rails db:migrate VERSION=20080906120000

रोलबैक माइग्रेशन

नवीनतम माइग्रेशन को rollback करने के लिए, या तो change विधि को change या down विधि को चलाकर। चलाने के आदेश:

5.0
rake db:rollback
5.0
rails db:rollback

रोलबैक अंतिम 3 माइग्रेशन

5.0
rake db:rollback STEP=3
5.0
rails db:rollback STEP=3

STEP वापस करने के लिए माइग्रेशन की संख्या प्रदान करते हैं।

रोलबैक सभी माइग्रेशन

5.0
rake db:rollback VERSION=0
5.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 बदलता है। यहां परिवर्तनों का एक पंक्ति-दर-पंक्ति वर्णन है:

  1. t.remove :ordered_at टेबल orders से कॉलम ordered_at गए कॉलम को हटा देता है।
  2. t.string :skew_number orders तालिका में skew_number नामक एक नया स्ट्रिंग-प्रकार कॉलम जोड़ता है।
  3. t.index :skew_number orders तालिका में skew_number कॉलम पर एक इंडेक्स जोड़ता है।
  4. 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 कार्यों को जोड़ता है।

चलाने के आदेश:

5.0
rake db:migrate:redo
5.0
rails db:migrate:redo

आप एक से अधिक संस्करण वापस जाने के लिए STEP पैरामीटर का उपयोग कर सकते हैं।

उदाहरण के लिए, 3 माइग्रेशन वापस जाने के लिए:

5.0
rake db:migrate:redo STEP=3
5.0
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। ऐसा इसलिए है क्योंकि प्रत्येक पंक्ति को नए जोड़े गए कॉलम के लिए डिफ़ॉल्ट मान के साथ अपडेट करना होगा। इसे रोकने के लिए (और परिनियोजन के दौरान डाउनटाइम को कम करने के लिए), आप अपने माइग्रेशन को तीन चरणों में विभाजित कर सकते हैं:

  1. ऊपर दिए गए एक के समान एक add_column माइग्रेशन जोड़ें, लेकिन कोई डिफ़ॉल्ट सेट न करें
  2. जब आपका ऐप चल रहा हो तो कॉलम को रेक कार्य में या कंसोल पर अपडेट करें। सुनिश्चित करें कि आपका एप्लिकेशन पहले से ही नई / अपडेट की गई पंक्तियों के लिए उस कॉलम में डेटा लिखता है।
  3. एक और change_column माइग्रेशन जोड़ें, जो उस कॉलम के डिफ़ॉल्ट को वांछित डिफ़ॉल्ट मान में बदलता है

निषिद्ध शून्य मान

अपने टेबल कॉलम में null मानों को रोकने के लिए, अपने माइग्रेशन में :null पैरामीटर जोड़ें, जैसे:

class AddPriceToProducts < ActiveRecord::Migration
  def change
    add_column :products, :float, null: false
  end
end

प्रवासन की स्थिति की जाँच करना

हम चल कर पलायन की स्थिति की जाँच कर सकते हैं

3.0 5.0
rake db:migrate:status
5.0
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


Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow