রেলগুলিতে একটি কলামের ধরণ দীর্ঘতর স্ট্রিংগুলিতে পরিবর্তন করা


90

প্রথম স্থানান্তরণে, আমি কলামে ঘোষিত করেছি contentস্ট্রিংটি অ্যাক্টিভাইকর্ডটি এনেটেট মণি অনুসারে স্ট্রিং (255) হিসাবে তৈরি করেছে।

আমি অ্যাপ্লিকেশনটিকে হিরকুতে ঠেকানোর পরে, যা পোস্টগ্রিজ ব্যবহার করে, যদি আমি ফর্মটিতে 255 এর চেয়ে বেশি স্ট্রিংয়ের সাথে প্রবেশ করি তবে আমি ত্রুটি পেয়েছি

PGError: ERROR: value too long for type character varying(255)

সমস্যাটি আমার পক্ষে এমন বিষয়বস্তু থাকা দরকার যা সম্ভবত দীর্ঘ দীর্ঘ স্ট্রিং থাকে (ফ্রি টেক্সট হাজার হাজার অক্ষর হতে পারে)

  1. কোন পরিবর্তনশীল (স্ট্রিং এটির জন্য উপযুক্ত নয়) পিজি গ্রহণ করবে?
  2. কীভাবে আমি এই কলামটির ধরণটি প্রতিস্থাপন করতে মাইগ্রেশন তৈরি করব

ধন্যবাদ

উত্তর:


217

আপনি textকোনও দৈর্ঘ্যের সীমা ছাড়াই একটি স্ট্রিং চাইলে আপনার রেলগুলি ব্যবহার করা উচিত । এর মতো একটি স্থানান্তর:

def up
  change_column :your_table, :your_column, :text
end
def down
  # This might cause trouble if you have strings longer
  # than 255 characters.
  change_column :your_table, :your_column, :string
end

জিনিস বাছাই করা উচিত। :null => falseএটির শেষে আপনি বা অন্য কোনও বিকল্পও চাইতে পারেন ।

আপনি যখন stringএকটি স্পষ্ট সীমা ছাড়াই একটি কলাম ব্যবহার করবেন, তখন রেলগুলি অন্তর্ভুক্ত করবে :limit => 255। তবে আপনি যদি ব্যবহার করেন textতবে ডাটাবেস সমর্থন করে এমন যথেচ্ছ দৈর্ঘ্যের স্ট্রিংয়ের টাইপ পাবেন get পোস্টগ্রাইএসকিউএল আপনাকে varcharদৈর্ঘ্য ছাড়াই একটি কলাম ব্যবহার করার অনুমতি দেয় তবে বেশিরভাগ ডাটাবেসগুলি তার জন্য একটি পৃথক প্রকার ব্যবহার করে এবং রেলগুলি varcharদৈর্ঘ্য ছাড়াই জানে না । পোস্টগ্রিএসকিউএল-এ textএকটি textকলাম পেতে আপনাকে রেলগুলিতে ব্যবহার করতে হবে । সেখানে ধরনের একটি কলাম মধ্যে পোস্টগ্রি কোন পার্থক্য textলিখুন এক varchar(কিন্তু varchar(n) হয় বিভিন্ন)। তদ্ব্যতীত, আপনি যদি পোস্টগ্রিজ এসকিউএল শীর্ষে স্থাপন করছেন তবে ব্যবহার করার কোনও কারণ নেই :string(varchar একে)), ডাটাবেস ব্যবহার করে textএবংvarchar(n)অতিরিক্ত দৈর্ঘ্যের সীমাবদ্ধতা ব্যতীত অভ্যন্তরীণভাবে একই varchar(n); কলামের আকারে আপনার যদি কেবল বাহ্যিক বাধা (যেমন একটি সরকারী ফর্ম বলে যে 897 / বি ফর্মের 432 ক্ষেত্রটি 23 অক্ষর দীর্ঘ হবে) কেবলমাত্র আপনার varchar(n)( :stringএকে) ব্যবহার করা উচিত ।

একটি সরু হিসাবে, আপনি যদি stringকোথাও একটি কলাম ব্যবহার করছেন , আপনার সর্বদা :limitনিজের জন্য একটি অনুস্মারক হিসাবে নির্দিষ্ট করা উচিত যে একটি সীমা রয়েছে এবং সীমা অতিক্রম না করে তা নিশ্চিত করার জন্য আপনার মডেলটিতে একটি বৈধতা থাকা উচিত। আপনি যদি সীমা অতিক্রম করেন, পোস্টগ্রিসকিউএল অভিযোগ করবে এবং একটি ব্যতিক্রম উত্থাপন করবে, মাইএসকিউএল চুপচাপ স্ট্রিং কেটে দেবে বা অভিযোগ করবে (সার্ভারের কনফিগারেশনের উপর নির্ভর করে), এসকিউএলাইট এটিকে যেমন আছে তেমন পাস করতে দেবে, এবং অন্যান্য ডাটাবেসগুলি অন্য কিছু করবে (সম্ভবত অভিযোগ করবে) ।

এছাড়াও, আপনার একই ডেটাবেস (যা সাধারণত হিরোকুতে পোস্টগ্র্রেএসকিউএল হবে) এর শীর্ষে বিকাশ, পরীক্ষা এবং স্থাপন করা উচিত, এমনকি আপনার ডাটাবেস সার্ভারের একই সংস্করণ ব্যবহার করা উচিত। ডাটাবেসগুলির মধ্যে অন্যান্য পার্থক্য রয়েছে (যেমন GROUP BY এর আচরণ) যেটি অ্যাক্টিভেকর্ড আপনাকে এড়ায় না। আপনি সম্ভবত এটি ইতিমধ্যে করছেন তবে আমি ভেবেছিলাম এটি যেভাবেই উল্লেখ করব।


আপডেট : অ্যাক্টিভেকর্ডের নতুন সংস্করণগুলি varcharসীমা ছাড়াই বুঝতে পারে তাই পোস্টগ্র্রেএসকিউএল সহ কমপক্ষে আপনি বলতে পারেন:

change_column :your_table, :your_column, :string, limit: nil

একটি varchar(n)কলাম পরিবর্তন করতে varchartextএবং varcharএখনও একই জিনিস যতটা পোস্টগ্রি সংশ্লিষ্ট হয় কিন্তু কিছু ফর্ম বিল্ডার তাদের ভিন্নভাবে বিবেচনা করবে আছেন: varcharএকটি পায় <input type="text">যেহেতু textএকটি মাল্টি-লাইন পায় <textarea>


13
দুর্দান্ত উত্তর। একটি দ্রষ্টব্য: রেলগুলি বর্তমানে পরিবর্তনের পদ্ধতির পরিবর্তে পরিবর্তন_কলামকে সমর্থন করে না ( গাইডস্রুব্রেইনআরএল.এস / মাইগ্রেশনস html# using-the- পরিবর্তন- আদর্শ ); যদি মেমরিটি পরিবেশন করে, আপনি যদি তা করেন তবে আপনি একটি অপরিবর্তনীয় মাইগ্রেশন তৈরি করতে পারবেন। আপ / ডাউন পদ্ধতিগুলি সহ এটি পুরাতন-স্কুল উপায়ে করা আরও ভাল।
কবিমাউন্ট

@ বরবোনজকি: এটির কোনও অর্থ নেই যে মাইগ্রেশন গাইডটিchange স্বয়ংক্রিয়ভাবে কোনও ধরনের পরিবর্তনের বিপরীত করতে সক্ষম হবে না এবং মাইগ্রেশন গাইড বলে যে "[পরিবর্তন পদ্ধতি] এই পদ্ধতিটি গঠনমূলক স্থানান্তর (কলাম বা টেবিল যুক্ত) লেখার জন্য পছন্দনীয়" এবং change_columnআইএনএন ' আপনি যে তালিকায় ইঙ্গিত করেছেন তাতে টি নেই তাই আমি মনে করি আপনি ঠিক বলেছেন। আমি এটি ব্যবহার করার জন্য স্থির করেছি up/ down(উপর একটি সতর্কতা সহ down), মাথা আপ জন্য ধন্যবাদ।
মিউ খুব ছোট

4
অন্যান্য পাঠকদের ভবিষ্যতের রেফারেন্সের জন্য, হিরোকুতে পোস্টগ্রিসে এই পদ্ধতিতে স্ট্রিং থেকে পাঠ্যে রূপান্তর করা ডেটা হারাবে না।
মেরিনা মার্টিন

4
@ ডেনিস: সম্ভবত "আপনার একই ডেটাবেস ব্যবহার করে পরীক্ষা করা এবং স্থাপন করা উচিত" আরও সঠিক হতে পারে। সাধারণ সমস্যাটি হ'ল লোকেরা (হাস্যকর) রেলগুলি ডিফল্ট এসকিউএলাইট সেটআপ ব্যবহার করে এবং যখন তারা অন্য কোনও কিছুর শীর্ষে স্থাপন করে তখন জিনিসগুলি আলাদা হয়ে যায়। পোস্টগ্রিএসকিউএল এখনও হেরোকুতে ডিফল্ট এবং সর্বাধিক সাধারণ বিকল্প, না?
মিউ খুব ছোট

4
পাশের নোটে, রেলগুলির অনুমান যে অনির্ধারিত দৈর্ঘ্যের ক্ষেত্রগুলি 255 বর্ণের হওয়া উচিত অদ্ভুত। পোস্টগ্র্রেএসকিউএল-তে কেবল সীমাহীন দৈর্ঘ্যের জন্য ব্যবহার করা প্রয়োজন হয় নাtext ; আপনি কেবল নিয়ন্ত্রণহীন ব্যবহার করতে পারেন varchar। রেল পোস্টগ্র্রেএসকিউএল নয়, এই বিজোড় সীমাটি চাপিয়ে দিচ্ছে।
ক্রেগ রিঞ্জার

8

যদিও গৃহীত উত্তরটি দুর্দান্ত, আমি এখানে একটি উত্তর যুক্ত করতে চেয়েছিলাম যে আশা করি আমার মতো অ বিশেষজ্ঞদের জন্য মূল পোস্টার প্রশ্ন অংশ 2 এর সাথে আরও ভালভাবে ডিল হয়।

  1. কীভাবে আমি এই কলামটির ধরণটি প্রতিস্থাপন করতে মাইগ্রেশন তৈরি করব

স্ক্যাফোल्ड মাইগ্রেশন উত্পন্ন করছে

আপনার কনসোলে টাইপ করে আপনার পরিবর্তনটি ধরে রাখার জন্য মাইগ্রেশন তৈরি করতে পারেন (কেবলমাত্র tableআপনার টেবিলের নামটি এবং columnআপনার কলামের নামটি প্রতিস্থাপন করুন )

rails generate migration change_table_column

এটি আপনার অভ্যন্তরে রেল অ্যাপ্লিকেশন / ডিবি / মাইগ্রেট / ফোল্ডারটিতে কঙ্কাল স্থানান্তর উত্পন্ন করবে। এই মাইগ্রেশনটি আপনার মাইগ্রেশন কোডের জন্য স্থানধারক।

উদাহরণ হিসেবে বলা যায় আমি একটি মাইগ্রেশন তৈরি করতে থেকে একটি কলাম ধরণ পরিবর্তন করতে চান stringকরতে textএকটি টেবিল নামক TodoItems মধ্যে:

class ChangeTodoItemsDescription < ActiveRecord::Migration
  def change
     # enter code here
     change_column :todo_items, :description, :text
  end
end

আপনার স্থানান্তর চলমান

একবার আপনি কলামটি পরিবর্তন করার জন্য কোডটি প্রবেশ করুন মাত্র চালান:

rake db:migrate

আপনার স্থানান্তর প্রয়োগ করতে। আপনি যদি কোনও ত্রুটি করেন তবে আপনি সর্বদা পরিবর্তনটি এই সাথে ফিরিয়ে নিতে পারবেন:

rake db:rollack

উপরে এবং ডাউন পদ্ধতি

নতুন পদ্ধতির পরিবর্তে গৃহীত উত্তর রেফারেন্স Upএবং Downপদ্ধতিগুলি Change। যেহেতু রেল 3.2 পুরানো স্টাইল আপ এবং ডাউন পদ্ধতিগুলি নতুন পরিবর্তন পদ্ধতির তুলনায় কয়েকটি সুবিধা উপস্থাপন করেছে। 'আপ এবং ডাউন' এড়িয়ে চলুন ActiveRecord::IrreversibleMigration exceptionরেল 4 প্রকাশের পরে আপনি reversibleএই ত্রুটিটি এড়াতে ব্যবহার করতে পারেন :

class ChangeProductsPrice < ActiveRecord::Migration
  def change
    reversible do |dir|
      change_table :products do |t|
        dir.up   { t.change :price, :string }
        dir.down { t.change :price, :integer }
      end
    end
  end
end

রেল উপভোগ করুন :)

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.