রিলে অন রুবি: আমি কীভাবে মাইগ্রেশন ব্যবহার করে কোনও বিদ্যমান কলামে নাল নয়?


130

আমার রেলস (৩.২) অ্যাপে আমার ডাটাবেসে প্রচুর টেবিল রয়েছে তবে আমি কয়েকটি নਾਲ সীমাবদ্ধতা যুক্ত করতে ভুলে গেছি। আমি প্রায় googled আছে কিন্তু আমি একটি মাইগ্রেশন লিখতে যা পাই না যা বিদ্যমান কলামে শূন্য হয় না।

টিয়া।

উত্তর:


93

রেলস 4+ এর জন্য, নেটের উত্তর ( চেঞ্জ_কলোম_নুল ব্যবহার করা ) আরও ভাল।

প্রি-রেলস 4, চেঞ্জ_কলোম চেষ্টা করুন ।


25
এই পদ্ধতির সাথে সাবধানতা অবলম্বন করুন - যদি এই কলামটি সম্পর্কে আপনার অন্যান্য বৈশিষ্ট্য (উদাহরণস্বরূপ একটি :limitসীমাবদ্ধতা) থাকে, আপনাকে ব্যবহার করার সময় সেই বৈশিষ্ট্যগুলি পুনরাবৃত্তি change_columnকরতে হবে, বা সেগুলি হারিয়ে যাবে। এই কারণে, আমি ব্যবহার করতে পছন্দ করিchange_column_null
নাথান ওয়ালেস

নোট করুন যে এটি একটি উত্পন্ন করে IrreversibleMigrationযা আপনার পছন্দসই নাও হতে পারে।
নিক নিলভ

@ নিকনিলোভ আপনি কি উত্তর বা নাথন ওয়ালেসের মন্তব্য সম্পর্কে কথা বলছেন?
চিহ্নিত করুন

@ মার্ক আমি উত্তরের বিষয়ে কথা বলছিলাম, যথেষ্ট নির্দিষ্ট না হওয়ার জন্য দুঃখিত।
নিক নিলভ

@ নিকনিলোভ কোনও ডব্লু ডাব্লু আমি ভাবিনি যে যদিও আমি কেবল দ্বিগুণ চেক করতে চেয়েছিলাম :)
মার্ক

274

আপনি পরিবর্তন_ কলাম_নুল ব্যবহার করতে পারেন :

change_column_null :table_name, :column_name, false

8
সবচেয়ে পরিষ্কার উত্তর!
জোশ

1
আমাকে একগুচ্ছ কলামের জন্য এটি পরিবর্তন করতে হয়েছিল এবং এর জন্য প্রতিটি কলামের জন্য কলামের ধরণ উল্লেখ করার দরকার নেই, আরও ভাল!
ডোরিয়ান

1
এটি আরও ভাল উত্তর। আমার ডাটাবেসে, আমি প্রাক-বিদ্যমান নাল মানগুলির সাথে একটি কলামে একটি নাল বাধা যুক্ত করছিলাম। change_column এই মানগুলিকে আপডেট করবে না। ডকুমেন্টেশন অনুসারে, পরিবর্তন_ কলাম_নুলের একটি alচ্ছিক চতুর্থ মান রয়েছে যা আপডেটের জন্য নতুন মান।
Merovex

এর জন্য ধন্যবাদ. সর্বোত্তম উত্তর.
রায়ান রেবো

1
আকর্ষণীয় পার্শ্ব প্রতিক্রিয়া .... মাইগ্রেশন ফিরিয়ে নেওয়া বিপরীতে ক্ষেত্রটিকে সেট করবে (মিথ্যা -> সত্য)। সুতরাং যদি আপনি নালার সীমাবদ্ধতা যুক্ত করতে বেশ কয়েকটি ক্ষেত্রের জন্য মাইগ্রেশন তৈরি করেন এবং কিছু ক্ষেত্রগুলি ইতিমধ্যে একটি নালিকা বাধা ছিল, তবে মাইগ্রেশনটি রোলব্যাক করুন, এটি ইতিমধ্যে যে কোনও ক্ষেত্র থেকে নাল প্রতিবন্ধকতা সরিয়ে ফেলবে।
jpw

10

1) প্রথম: ডিফল্ট মান সহ কলাম যুক্ত করুন

2) তারপর: ডিফল্ট মান সরান

add_column :orders, :items, :integer, null: false, default: 0
change_column :orders, :items, :integer, default: nil

2
এটি সঠিক সমাধান যখন আপনাকে নকল নয় এমন নতুন কলাম যুক্ত করতে হবে তখন আপনাকে প্রথমে এটি নির্ধারণ করতে হবে যে এটির ডিফল্ট মান রয়েছে কারণ এসকিউএলাইট অভিযোগ করবে (ডিফল্ট মান নাল দিয়ে একটি নট কলাম যোগ করতে পারে না), এবং তারপরে এটি সরিয়ে ফেলুন!
মিলান

2

আপনি যদি এটি কোনও নতুন তৈরি মাইগ্রেশন স্ক্রিপ্ট / স্কিমাতে ব্যবহার করেন তবে আমরা কীভাবে এটি সংজ্ঞা দিতে পারি

class CreateUsers < ActiveRecord::Migration[5.2]
  def change
    create_table :users do |t|
    t.string :name, null: false     # Notice here, NOT NULL definition
    t.string :email, null: false
    t.string :password, null: false
    t.integer :created_by
    t.integer :updated_by 

    t.datetime :created_at
    t.datetime :updated_at, default: -> { 'CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP' }
   end
  end
end
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.