রেলস ডিবি মাইগ্রেশন - একটি টেবিল কীভাবে ফেলবেন?


506

আমি একটি টেবিল যুক্ত করেছি যা আমি ভেবেছিলাম আমার প্রয়োজন হবে তবে এখন এটি ব্যবহারের পরিকল্পনা নেই। আমি কীভাবে সেই টেবিলটি সরিয়ে ফেলব?

আমি ইতিমধ্যে মাইগ্রেশন চালিয়েছি, সুতরাং টেবিলটি আমার ডাটাবেসে রয়েছে। আমি চিত্রিত rails generate migrationএটি হ্যান্ডেল করতে সক্ষম হওয়া উচিত, কিন্তু আমি এখনও কিভাবে তা বুঝতে পারেনি।

আমি চেষ্টা করেছিলাম:

rails generate migration drop_tablename

কিন্তু এটি কেবল একটি খালি স্থানান্তর তৈরি করেছে।

রেলগুলিতে একটি টেবিল ফেলে দেওয়ার "অফিসিয়াল" উপায় কী?


1
যেহেতু rails generate migrationসারণী তৈরি করতে, কলাম যুক্ত করতে বা পরিবর্তন করতে পারে ইত্যাদি জন্য মাইগ্রেশন কোড উত্পন্ন করার জন্য কমান্ড-লাইন বিকল্প রয়েছে তাই এটিতে যদি কোনও টেবিল বাদ দেওয়ার বিকল্প থাকে তবে এটি ভাল হবে - তবে তা হয় না। অবশ্যই, upঅংশটি লেখা সহজ - কেবল কল করুন drop_table- তবে downঅংশটি, আবার টেবিলটি তৈরি করা, সবসময় এত সহজ নাও হতে পারে, বিশেষত যদি প্রশ্নে সারণীর স্কিমাটি প্রাথমিকভাবে তৈরির পরে মাইগ্রেশন দ্বারা পরিবর্তন করা হয়েছিল। হয়তো কারও কাছে রেলের বিকাশকারীদের পরামর্শ দেওয়া উচিত যে এই জাতীয় বিকল্প যুক্ত করা ভাল ধারণা হবে।
তিমু লেইস্তি

3
@ টিমুলেসিটি কীভাবে স্কিমা.আরবি থেকে বর্তমান সারণী সংজ্ঞাটি অনুলিপি করে পেস্ট করবেন? আমি সব সময় এটি করি ...
jasoares

1
@ জোও সোয়ারস: ঠিক আছে, আমার ধারণা এটি কার্যকর হয়। তবে, প্রক্রিয়াটি স্বয়ংক্রিয়ভাবে পরিচালিত হতে পারলে এটি দুর্দান্ত হবে, যাতে আপনি কেবলমাত্র rakeপ্যারামিটার হিসাবে একটি টেবিলের নাম সহ একটি মাইগ্রেশন-ক্রিয়েশন কমান্ড দিতে পারেন , যা প্রয়োজনীয় upএবং downকার্যকারিতা তৈরি করে ।
তীমু লেইস্তি

উত্তর:


646

আপনি ইতিমধ্যে আপনার চান কোডটি পেতে মাইগ্রেশন উত্সাহিত করতে সক্ষম হবেন না। আপনি একটি খালি মাইগ্রেশন তৈরি করতে পারেন এবং তারপরে আপনার প্রয়োজনীয় কোডটি এটিকে জনপ্রিয় করতে পারেন।

মাইগ্রেশনে আপনি কীভাবে বিভিন্ন কার্য সম্পাদন করবেন সে সম্পর্কিত তথ্য এখানে পাবেন:

http://api.rubyonrails.org/classes/ActiveRecord/Migration.html

আরও সুনির্দিষ্টভাবে আপনি নীচের পদ্ধতির সাহায্যে কোনও টেবিলটি কীভাবে ফেলেবেন তা দেখতে পাবেন:

drop_table :table_name

3
এটি আমার জন্যও কাজ করেছিল। তবে পূর্ণ মাইগ্রেশন (স্ক্র্যাচ থেকে ইনস্টল করা) এ টেবিলটি প্রথমে তৈরি করা হবে এবং পরে আবার বাদ দেওয়া হবে। রাস্তায় মাইগ্রেশন তৈরি এবং বাদ দেওয়া কি নিরাপদ?
বার্ক

2
টেবিলগুলি ফেলে রাখা বা আগের ডাটাবেস স্কিমায় ফিরে যাওয়া ভাল কিনা সে সম্পর্কে এখানে কোনও দৃশ্য?
উইলিয়াম

3
যদি আপনি টেবিলটি সম্পন্ন করেন এবং এটি আর ব্যবহার করার পরিকল্পনা না করেন তবে আমি বলব যে এটি কেবল ফেলে দিন। এটি ব্যবহার না করা থাকলে এ থেকে মুক্তি পাওয়া ভাল।
পিট

6
@ বিডার অ্যাকোস্টাবার্জেসের উত্তরটি আরও স্ব-ব্যাখ্যামূলক এবং নির্ভুল
অনেরিনাস

2
কীভাবে সমস্ত বিদেশী কী সরিয়ে ফেলবেন? অন্যান্য সারণীতে কলাম রয়েছে যেটি টেবিলটি বাদ দেওয়া হচ্ছে।
মার্টিন কোনিসেক

352

প্রথমে আপনার পছন্দের যে কোনও নাম দিয়ে খালি স্থানান্তর তৈরি করুন। এটি যথাযথ তারিখ তৈরি করার কারণে এটি এটি করা গুরুত্বপূর্ণ।

rails generate migration DropProductsTable

এটি / db / মাইগ্রেট / 20111015185025_DP_products_table.rb এর মতো একটি .rb ফাইল উত্পন্ন করবে

এখন দেখতে এই ফাইলটি সম্পাদনা করুন:

class DropProductsTable < ActiveRecord::Migration
  def up
    drop_table :products
  end

  def down
    raise ActiveRecord::IrreversibleMigration
  end
end

আমি যুক্ত করা একমাত্র জিনিস ছিল drop_table :productsএবং raise ActiveRecord::IrreversibleMigration

তারপরে দৌড়াও rake db:migrateএবং এটি আপনার জন্য টেবিলটি ফেলে দেবে।


14
টেবিল বাদ দেওয়া হচ্ছে পুনরায় তৈরি করার জন্য একটি ডাউন মাইগ্রেশন ব্যবহার করা উচিত।
fflyer05

1
এই মাইগ্রেশনটি কখনও বিকাশ করতে পারে না, এমনকি উন্নয়নেও। ডাউন মাইগ্রেশনকে খালি ছেড়ে দেওয়া কি ভাল?
mhriess

1
এটিই আরও ভাল উত্তর + ফ্লাইওয়ারের মন্তব্য
জ্যাক শাপিরো

2
@ এমজিনিসিম এবং fflyer05 সঠিক, যাতে কোনও অদ্ভুত জিনিস এড়াতে আপনার নীচের পদ্ধতিতে টেবিলটি পুনরায় তৈরি করা উচিত।
সেবাস্তিয়ালসনো

4
একটি টেবিল ফেলে দেওয়া সমস্ত ডেটা মুছে দেয়, আপনি যদি downপদ্ধতিতে এটি পুনরায় তৈরি করেন তবে আপনি এটি পুনরুদ্ধার করতে পারবেন না এটি আসলে কোনও সঠিক রোল ব্যাক নয়। এটি পরিষ্কারভাবে ইঙ্গিত করা ভাল যে মাইগ্রেশনটি পুনরুদ্ধার করা যেতে পারে এমন মিথ্যা ধারণা দেওয়ার চেয়ে অপরিবর্তনীয়।
ভিভি

314

আপনার মাইগ্রেশন ম্যানুয়ালি লিখুন। যেমন রান rails g migration DropUsers

মাইগ্রেশনের কোড হিসাবে আমি কেবল ম্যাক্সওয়েল হোল্ডারের পোস্টের মাইগ্রেশন চেকলিস্টের উদ্ধৃতি দিচ্ছি

খারাপ - চলমান rake db:migrateএবং তারপর rake db:rollbackব্যর্থ হবে

class DropUsers < ActiveRecord::Migration
  def change
    drop_table :users
  end
end

ভাল - অভিপ্রায়টি প্রত্যাহারযোগ্য হওয়া উচিত নয় এমন অভিপ্রায় প্রকাশ করে

class DropUsers < ActiveRecord::Migration
  def up
    drop_table :users
  end

  def down
    fail ActiveRecord::IrreversibleMigration
  end
end

ভাল - আসলে বিপরীত

class DropUsers < ActiveRecord::Migration
  def change
    drop_table :users do |t|
      t.string :email, null: false
      t.timestamps null: false
    end
  end
end

যদি আপনি এই ব্লকটি কেটে পেস্ট করে থাকেন তবে বিদেশী কীগুলি schema.rbঅনুসন্ধান করতেও ভুলবেন না schema.rb। তারপরে drop_tableব্লকে বিদেশী কী সংজ্ঞা যুক্ত করুন , উদাহরণস্বরূপ:t.foreign_key "other_table"
লেনচো রেয়েস

197

এখানে প্রদত্ত উত্তরগুলি যথাযথভাবে কাজ করার সময়, আমি কিছুটা আরও 'সরল' চেয়েছিলাম, আমি এটি এখানে পেয়েছি: লিঙ্কটি প্রথমে রেল কনসোলে প্রবেশ করুন:

$rails console

তারপরে শুধু টাইপ করুন:

ActiveRecord::Migration.drop_table(:table_name)

এবং সম্পন্ন, আমার জন্য কাজ!


মডেলটি আপনি চালানোর আগ পর্যন্ত এখনও রয়েছেনrails destroy model User
gm2008

2
আপনি যদি ভাল করার জন্য টেবিল থেকে মুক্তি পেতে চান তবে এটি চালান। কারা এই ড্রপ সম্পর্কে অজানা হবে। এই কমান্ডটি চালানোর পরে মাইগ্রেশন ভেঙে গেছে। তৈরি করতে পারবেন না, ড্রপ করুন ... ইত্যাদি। ত্রুটি এসকিউএলআইটি3 :: এসকিউএলএক্সসেপশন: এ জাতীয় কোনও টেবিল নেই: আদায়: ড্রপ টেবিল "সামিটযোগ্য"
জি

36

নিম্নলিখিত কমান্ডটি ব্যবহার করে আপনাকে একটি নতুন মাইগ্রেশন ফাইল তৈরি করতে হবে

rails generate migration drop_table_xyz

এবং নতুন উত্পন্ন স্থানান্তর ফাইল (ডিবি / মাইগ্রেশন / এক্সএক্সএক্সএক্সএক্সএক্সএক্স_ড্রোপ_ টেবিল_ক্সিজ) এর মতো ড্রপ_ টেবিল কোড লিখুন

drop_table :tablename

অথবা আপনি যদি কোনও স্থানান্তর ছাড়াই টেবিলটি ফেলে রাখতে চান তবে রেল কনসোলটি কেবল খোল

$ rails c

এবং নিম্নলিখিত কমান্ড কার্যকর

ActiveRecord::Base.connection.execute("drop table table_name")

অথবা আপনি আরও সরলিকৃত কমান্ড ব্যবহার করতে পারেন

ActiveRecord::Migration.drop_table(:table_name)

21
  1. রেল জি মাইগ্রেশন ড্রপ_উসার্স
  2. স্থানান্তর সম্পাদনা করুন
    class DropUsers < ActiveRecord::Migration
      def change
        drop_table :users do |t|
          t.string :name
          t.timestamps
        end
      end
    end
  1. rak db: স্থানান্তরিত করা

13

আমি মনে করি, পুরোপুরি "অফিসিয়াল" হওয়ার জন্য আপনাকে একটি নতুন মাইগ্রেশন তৈরি করতে হবে এবং ড্রপ-টেবিলটি সেলফআপে রাখা উচিত। স্ব.ডাউনড পদ্ধতিতে পুরো টেবিলটি পুনরায় তৈরি করতে সমস্ত কোড থাকা উচিত contain সম্ভবত আপনি কোড স্থানান্তর করার সময় সেই কোডটি স্কিমা.আরবি থেকে নেওয়া যেতে পারে।

কিছুটা অদ্ভুত বলে মনে হচ্ছে, একটি টেবিল তৈরি করার জন্য কোড স্থাপন করা আপনি জানেন যে আপনার আর প্রয়োজন হবে না, তবে এটি মাইগ্রেশন কোডটি সম্পূর্ণ এবং "অফিসিয়াল" রাখবে, তাই না?

আমি কেবল একটি টেবিলটি ফেলে দেওয়ার জন্য এটি করেছি, তবে সততার সাথে "ডাউন" পরীক্ষা করিনি এবং কেন করব তা নিশ্চিত নই।


1
অদ্ভুত তবে দেখে মনে হচ্ছে এটিও আমার করতে হবে।
ডিজিটাল ওয়েস্টি

7
অথবা আপনি কেবল ব্যবহার করতে পারেন: raise ActiveRecord::IrreversibleMigrationস্ব.ডাউনড পদ্ধতিতে, তাই আপনি যদি কখনও রোলব্যাক করার চেষ্টা করেন তবে নিজেকে কমপক্ষে একটি ত্রুটি / বিজ্ঞপ্তি দিন।
স্টিফ রোজ

1
আমি এটিকে নিখুঁতভাবে পরীক্ষা করব কারণ অন্যথায় আমি আমার প্রকল্পে অনাকাঙ্ক্ষিত কোড প্রবর্তন করছি। আসল স্থানান্তরের আপ পদ্ধতিটি আমি কীভাবে পুনরায় ব্যবহার করতে পারি? আমি চেষ্টা করেছি CreateMyTable.upএবং ActiveRecord::Migrator.run(:up, ActiveRecord::Migrator.migrations_paths, X)যেখানে এক্স স্থানান্তর হ'ল যা মূলত সারণীটি তৈরি করেছে, তবে দুটোই কাজ করে না - উভয় পদ্ধতির মধ্যে এআর প্রথমে মাইগ্রেশনটি ইতিমধ্যে প্রয়োগ করা হয়েছে কিনা তা পরীক্ষা করে দেখেছে এবং এটি থাকলে নিঃশব্দে এড়িয়ে যায়। `
আইজাক বিতেশ

12

আপনি কেবল রেল কনসোল থেকে একটি টেবিল ড্রপ করতে পারেন। প্রথমে কনসোলটি খুলুন

$ rails c

তারপরে এই কমান্ডটি কনসোলে পেস্ট করুন

ActiveRecord::Migration.drop_table(:table_name)

টেবিলের নামটি প্রতিস্থাপন করুনআপনি মুছে ফেলতে চান টেবিলের সাথে টেবিলের ।

আপনি টার্মিনাল থেকে সরাসরি টেবিল ড্রপ করতে পারেন। আপনার অ্যাপ্লিকেশনটির মূল ডিরেক্টরিতে প্রবেশ করুন এবং এই আদেশটি চালান

$ rails runner "Util::Table.clobber 'table_name'"

10

সরল ও সরকারী উপায় হ'ল:

  rails g migration drop_tablename

এখন আপনার ডিবিতে / মাইগ্রেটে যান এবং আপনার ফাইলটি অনুসন্ধান করুন যা ড্রপ_সামগ্রহটিকে ফাইলের নাম হিসাবে ধারণ করে এবং এটিতে এটি সম্পাদনা করে।

    def change
      drop_table :table_name
    end

তারপরে আপনার চালানো দরকার

    rake db:migrate 

আপনার কনসোল এ


9

আপনি কোনও মাইগ্রেশন গাইডের মতোই ফিরে যেতে পারেন:

http://guides.rubyonrails.org/active_record_migrations.html#reverting-previous-migrations

একটি স্থানান্তর উত্পন্ন করুন:

rails generate migration revert_create_tablename

মাইগ্রেশন লিখুন:

require_relative '20121212123456_create_tablename'

class RevertCreateTablename < ActiveRecord::Migration[5.0]
  def change
    revert CreateTablename    
  end
end

এইভাবে আপনি রোলব্যাক করতে পারেন এবং যে কোনও স্থানান্তরকে ফিরিয়ে আনতে ব্যবহার করতে পারেন


8

ব্যতিক্রম উত্থাপন বা এখন খালি টেবিলটি পুনরায় তৈরি করার চেষ্টা করার বিকল্প - এখনও মাইগ্রেশন রোলব্যাক সক্ষম করার সময়, আবার করুন -

def change
  drop_table(:users, force: true) if ActiveRecord::Base.connection.tables.include?('users')
end

8

আমি এটিকে মাইগ্রেশন স্ক্রিপ্ট দিয়ে কাজ করতে সক্ষম হইনি তাই আমি এই সমাধানটি নিয়ে এগিয়ে গেলাম। টার্মিনালটি ব্যবহার করে রেল কনসোল প্রবেশ করুন:

rails c

আদর্শ

ActiveRecord::Migration.drop_table(:tablename)

এটি আমর জন্য ভাল কাজ করছে. এটি পূর্ববর্তী সারণীটি সরিয়ে ফেলবে। চালাতে ভুলবেন না

rails db:migrate



2

আমার টেবিলগুলির সাথে আমাদের মাইগ্রেশন স্ক্রিপ্টগুলি মুছে ফেলতে হবে ...

class Util::Table < ActiveRecord::Migration

 def self.clobber(table_name)   
    # drop the table
    if ActiveRecord::Base.connection.table_exists? table_name
      puts "\n== " + table_name.upcase.cyan + " ! " 
           << Time.now.strftime("%H:%M:%S").yellow
      drop_table table_name 
    end

    # locate any existing migrations for a table and delete them
    base_folder = File.join(Rails.root.to_s, 'db', 'migrate')
    Dir[File.join(base_folder, '**', '*.rb')].each do |file|
      if file =~ /create_#{table_name}.rb/
        puts "== deleting migration: " + file.cyan + " ! "
             << Time.now.strftime("%H:%M:%S").yellow
        FileUtils.rm_rf(file)
        break
      end
    end
  end

  def self.clobber_all
    # delete every table in the db, along with every corresponding migration 
    ActiveRecord::Base.connection.tables.each {|t| clobber t}
  end

end

টার্মিনাল উইন্ডো রান থেকে:

$ rails runner "Util::Table.clobber 'your_table_name'"

অথবা

$ rails runner "Util::Table.clobber_all"

1

আপনি করতে পারেন সর্বোত্তম উপায়

rails g migration Drop_table_Users

তারপরে নিম্নলিখিতটি করুন

rake db:migrate

1

চালান

rake db:migrate:down VERSION=<version>

কোথায় <version>আপনি যে স্থানান্তর ফাইলটি ফিরে যেতে চান তার সংস্করণ নম্বরটি ।

উদাহরণ: -

rake db:migrate:down VERSION=3846656238

1

যদি কেউ এসকিউএল এ কীভাবে করবেন তা সন্ধান করছে।

আদর্শ rails dbconsoleটার্মিনাল থেকে

পাসওয়ার্ড লিখুন

কনসোল করতে

USE db_name;

DROP TABLE table_name;

exit

অনুগ্রহ করে স্কিমা থেকে মাইগ্রেশন ফাইল এবং টেবিলের কাঠামো সরিয়ে দিতে ভুলবেন না


আপনি কেবল টাইপ করে এটি খুলতে পারেনrails db
আরকে

0

আপনি যদি একটি নির্দিষ্ট টেবিল বাদ দিতে চান তবে আপনি এটি করতে পারেন

$ rails db:migrate:up VERSION=[Here you can insert timestamp of table]

অন্যথায় আপনি যদি আপনার সমস্ত ডাটাবেস ফেলে দিতে চান তবে আপনি করতে পারেন

$rails db:drop

-1

ড্রপ টেবিল / মাইগ্রেশন

চালান: - $ রেলগুলি মাইগ্রেশন ড্রপ টেবিলনাম তৈরি করে

exp: - s রেলগুলি মাইগ্রেশন ড্রপপ্রডাক্টস উত্পাদন করে


-1

এই আদেশটি চালান:

rails g migration drop_table_name

তারপর:

rake db:migrate

অথবা আপনি যদি MySQL ডাটাবেস ব্যবহার করেন তবে:

  1. ডাটাবেস সহ লগইন করুন
  2. show databases;
  3. show tables;
  4. drop table_name;

3
এই উত্তরটি কি বিদ্যমান, গৃহীত উত্তরের সাথে কিছু যুক্ত করে? যদি তা না হয় তবে এটি পোস্ট করার দরকার নেই।
টম লর্ড

1
এটি ইতিমধ্যে প্রশ্নটিতে ইতিমধ্যে বর্ণিত, রেলের 4.2 র ফাঁকা স্থানান্তর তৈরি করে creates
বার্ট ব্রুইনোগে

এটি ওপি মূলত যা চেষ্টা করেছিল তা হ'ল ... এই উত্তরটি সরানো উচিত
ওয়েবাহোলিক

একটি সহজ উত্তর যুক্ত করা নিম্নোক্ত হওয়ার যোগ্য নয়। আমার ধারণা, এটি এখনও প্রাসঙ্গিক। দয়া করে নতুন ব্যবহারকারীদের প্রতি দয়া করুন।
আরকে

-2

আপনি যদি স্কিমা থেকে টেবিলটি মুছতে চান তবে নীচের ক্রিয়াকলাপটি সম্পাদন করুন -

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