Rails DB geçiş - nasıl bir tablo bırakmak için?


507

İhtiyacım olacağını düşündüğüm bir tablo ekledim, ancak artık onu kullanmayı planlamıyorum. Bu tabloyu nasıl kaldırmalıyım?

Ben zaten taşıma çalıştırmak, bu yüzden tablo benim veritabanında. Bunu rails generate migrationhalledebilmeliyim, ama henüz nasıl olduğunu anlayamadım.

Denedim:

rails generate migration drop_tablename

ama bu boş bir göç yarattı.

Rails'te bir masa bırakmanın "resmi" yolu nedir?


1
rails generate migrationTablo oluşturmak, sütun eklemek veya değiştirmek için geçiş kodu oluşturmak için komut satırı seçeneklerine sahip olduğundan , bir tabloyu bırakmak için bir seçeneğe sahip olsaydı iyi olurdu - ama değil. Tabii, upparçayı yazmak basittir - sadece arayın drop_table- ancak downtabloyu yeniden üreten kısım, özellikle söz konusu tablonun şeması ilk oluşturulmasından sonra geçişlerle değiştirildiyse, her zaman çok kolay olmayabilir. Belki birisi Rails geliştiricilerine böyle bir seçenek eklemenin iyi bir fikir olacağını öne sürmelidir.
Teemu Leisti

3
@TeemuLeisti Geçerli tablo tanımını schema.rb'den kopyalayıp yapıştırmaya ne dersiniz? Bunu her zaman yaparım ...
jasoares

1
@ João Soares: Tamam, sanırım işe yarıyor. Ancak, işlemin otomatik hale getirilmesi güzel olurdu, böylece rakebir tablo oluşturma parametresi olarak, gerekli upve downişlevleri üretecek bir taşıma oluşturma komutu verebilirsiniz .
Teemu Leisti

Yanıtlar:


647

İstediğiniz koda sahip olmak için taşıma işlemini her zaman oluşturamazsınız. Boş bir taşıma oluşturabilir ve daha sonra ihtiyacınız olan kodla doldurabilirsiniz.

Bir taşıma işleminde farklı görevlerin nasıl gerçekleştirileceği hakkında bilgi burada bulabilirsiniz:

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

Daha spesifik olarak, aşağıdaki yaklaşımı kullanarak bir tabloyu nasıl bırakacağınızı görebilirsiniz:

drop_table :table_name

3
Bu benim için de işe yaradı. Ancak tam taşıma işlemlerinde (sıfırdan yükleme) tablo şimdi önce oluşturulacak ve daha sonra tekrar bırakılacak. Oluşturma ve bırakma taşıma işlemlerini yoldan kaldırmak güvenli midir?
Berkes

2
Tabloları bırakmak veya önceki bir veritabanı şemasına geri dönmek daha iyi mi?
william

3
Eğer masa ile işiniz bittiğinde ve artık kullanmayı planlamıyorsanız, sadece bırakın diyorum. Kullanılmıyorsa ondan kurtulmak daha iyidir.
Pete

6
Tarafından cevap @BederAcostaBorges daha açıklayıcı ve doğru
onerinas

2
Tüm yabancı anahtarlar nasıl kaldırılır? Diğer tablolarda bırakılan tabloya işaret eden sütunlar vardır.
Martin Konicek

352

Önce istediğiniz herhangi bir adla boş bir taşıma oluşturun. Uygun tarihi oluşturduğu için bu şekilde yapmak önemlidir.

rails generate migration DropProductsTable

Bu, / db / migrate / like 20111015185025_drop_products_table.rb içinde bir .rb dosyası oluşturur

Şimdi bu dosyayı aşağıdaki gibi görünecek şekilde düzenleyin:

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

  def down
    raise ActiveRecord::IrreversibleMigration
  end
end

Eklediğim tek şey drop_table :productsve raise ActiveRecord::IrreversibleMigration.

Sonra koş rake db:migrateve masa senin için düşecek.


14
Bırakılan tabloyu yeniden oluşturmak için aşağı taşıma kullanılmalıdır.
fflyer05

1
Bu göç, gelişmede bile asla geri alınamazdı. Aşağı geçişi boş bırakmak daha iyi olur mu?
mhriess

1
Bu daha iyi cevap + fflyer'ın yorumu
Zack Shapiro

2
@mjnissim ve fflyer05 doğrudur, garip şeylerden kaçınmak için tabloyu aşağı yönteminde yeniden oluşturmanız gerekir.
Sebastialonso

4
Bir tabloyu düşürmek tüm verileri siler, eğer downyöntemde yeniden oluşturursanız, onu kurtarmayacaksınız, böylece aslında uygun bir geri dönüş olmaz. Göçün geri alınabileceğine dair yanlış bir fikir vermek yerine geri döndürülemez olduğunu açıkça belirtmek daha iyidir.
vivi

314

Taşıma işleminizi manuel olarak yazın. Örneğin koş rails g migration DropUsers.

Göç koduna gelince, Maxwell Holder'ın gönderdiği Rails Göç Kontrol Listesini teklif edeceğim

KÖTÜ - çalışıyor rake db:migrateve rake db:rollbackbaşarısız oluyor

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

İYİ - göçün geri çevrilemez olması niyetini ortaya koyuyor

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

  def down
    fail ActiveRecord::IrreversibleMigration
  end
end

DAHA İYİ - aslında tersine çevrilebilir

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

Bloktan kesip yapıştırıyorsanız schema.rb, schema.rbyabancı anahtarları da aramayı unutmayın . Ardından drop_tablebloğa yabancı anahtar tanımını ekleyin , örneğin:t.foreign_key "other_table"
Lencho Reyes

197

Burada verilen cevaplar düzgün çalışıyor olsa da, biraz daha 'basit' bir şey istedim, burada buldum: link Önce ray konsoluna girin:

$rails console

Sonra şunu yazın:

ActiveRecord::Migration.drop_table(:table_name)

Ve bitti, benim için çalıştı!


Model siz rails destroy model User
koşana

2
Bunu sadece masadan kurtulmak istiyorsanız çalıştırın. Raylar bu düşüşten habersiz olacaktır. Bu komut çalıştırıldıktan sonra taşıma işlemi bozuk. YARATILAMIYOR, DÜŞÜRÜN ... VB. HATA SQLite3 :: SQLException: böyle bir tablo yok: tahakkuk: DROP TABLE "sometable"
zee

36

Aşağıdaki komutu kullanarak yeni bir taşıma dosyası oluşturmanız gerekir

rails generate migration drop_table_xyz

ve yeni oluşturulan taşıma dosyasına drop_table kodu yazın (db / migration / xxxxxxx_drop_table_xyz)

drop_table :tablename

Veya geçiş olmadan tablo bırakmak istiyorsanız, raylar konsolunu

$ rails c

ve aşağıdaki komutu yürütün

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

veya daha basitleştirilmiş komut kullanabilirsiniz

ActiveRecord::Migration.drop_table(:table_name)

21
  1. rails g migration Instagram Hesabındaki Resim ve Videoları drop_users
  2. taşımayı düzenle
    class DropUsers < ActiveRecord::Migration
      def change
        drop_table :users do |t|
          t.string :name
          t.timestamps
        end
      end
    end
  1. tırmık db: göç

13

Bence, tamamen "resmi" olmak için, yeni bir göç oluşturmanız ve drop_table dosyasını self.up dosyasına koymanız gerekir. Daha sonra self.down yöntemi, tabloyu tam olarak yeniden oluşturmak için tüm kodu içermelidir. Muhtemelen bu kod, taşımayı oluşturduğunuz sırada schema.rb dosyasından alınabilir.

Artık ihtiyacınız olmayacağını bildiğiniz bir tablo oluşturmak için kod koymak biraz garip görünüyor, ancak bu tüm göç kodunu eksiksiz ve "resmi" tutacak, değil mi?

Ben sadece bir tablo için düşmesi gereken yaptı, ama dürüst "aşağı" test etmedi ve neden ben emin değilim.


1
Tuhaf ama görünüşe göre bunu da yapmam gerekecek.
digitalWestie

7
Ya da sadece raise ActiveRecord::IrreversibleMigrationself.down yönteminde kullanabilirsiniz: böylece LEAST'ta geri dönmeye çalışırsanız kendinize bir hata / uyarı verirsiniz.
Steph Rose

1
Sadece aksi takdirde projeme test edilmemiş kod tanıtmak çünkü aşağı test ediyorum. Özgün taşıma yöntemini nasıl yeniden kullanabilirim? Ben denedim CreateMyTable.upve ActiveRecord::Migrator.run(:up, ActiveRecord::Migrator.migrations_paths, X)nerede X tablo başlangıçta oluşturan göç, ama her ikisi de çalışır - her iki yaklaşımda, AR ilk geçiş zaten uygulanmış olup olmadığını denetler ve varsa sessizce atlar. ``
Isaac Betesh

12

raylar konsolundan bir tablo bırakabilirsiniz. önce konsolu açın

$ rails c

sonra bu komutu konsola yapıştırın

ActiveRecord::Migration.drop_table(:table_name)

table_name yerine silmek istediğiniz tabloyu yazın.

tabloyu doğrudan terminalden de bırakabilirsiniz. uygulamanızın kök dizinini girin ve bu komutu çalıştırın

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

10

Basit ve resmi yol şu olurdu:

  rails g migration drop_tablename

Şimdi db / migrate dosyanıza gidin ve dosya adı olarak drop_tablename'i içeren dosyanızı arayın ve bunu bu şekilde düzenleyin.

    def change
      drop_table :table_name
    end

O zaman koşmalısın

    rake db:migrate 

konsolunuzda.


9

Bir taşımayı rehberde olduğu gibi geri alabilirsiniz:

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

Bir taşıma oluşturun:

rails generate migration revert_create_tablename

Taşıma işlemini yazın:

require_relative '20121212123456_create_tablename'

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

Bu şekilde geri alabilir ve herhangi bir taşımayı geri almak için kullanabilirsiniz


8

İstisna oluşturma veya şimdi boş bir tablo oluşturmaya çalışma alternatifi - yine de taşıma geri alma, yineleme vb.

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

8

Geçiş betiği ile çalışmasını sağlayamadım, bu yüzden bu çözümle devam ettim. Terminali kullanarak ray konsolunu girin:

rails c

tip

ActiveRecord::Migration.drop_table(:tablename)

Benim için iyi çalışıyor. Bu, önceki tabloyu kaldıracaktır. Koşmayı unutma

rails db:migrate


4

ActiveRecord::Base.connection.drop_table :table_name


2

Taşıma komut dosyalarımızı tabloların kendileriyle birlikte silmem gerekiyordu ...

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

terminal penceresinden çalıştır:

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

veya

$ rails runner "Util::Table.clobber_all"

1

yapmanın en iyi yolu

rails g migration Drop_table_Users

o zaman aşağıdakileri yapın

rake db:migrate

1

Çalıştırmak

rake db:migrate:down VERSION=<version>

Geri almak <version>istediğiniz taşıma dosyanızın sürüm numarası nerede .

Misal:-

rake db:migrate:down VERSION=3846656238

1

Herkes SQL nasıl yapılacağını arıyor.

tip rails dbconsoleterminalden

Parolanı Gir

Konsolda do

USE db_name;

DROP TABLE table_name;

exit

Lütfen taşıma dosyasını ve tablo yapısını şemadan kaldırmayı unutmayın


Ayrıca sadece yazarak da açabilirsinizrails db
ARK

0

belirli bir tabloyu bırakmak isterseniz,

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

Aksi takdirde tüm veritabanınızı bırakmak istiyorsanız

$rails db:drop

-1

Damla Tablosu / Geçiş

run: - $ rails geçiş oluşturur DropTablename

exp: - $ raylar geçiş oluşturur DropProducts


-1

Bu komutu çalıştırın: -

rails g migration drop_table_name

sonra:

rake db:migrate

veya MySql veritabanını kullanıyorsanız:

  1. veritabanı ile giriş
  2. show databases;
  3. show tables;
  4. drop table_name;

3
Bu cevap mevcut, kabul edilen cevaba herhangi bir şey ekliyor mu? Değilse, bunu göndermeye gerek yoktur.
Tom Lord

1
bu, sorunun kendisinde belirtildiği gibi, raylar 4.2'de boş bir göç yaratır.
bert bruynooghe

Bu OP'nin ilk denediği şey tam olarak ... bu cevap kaldırılmalıdır
webaholik

Basit bir cevap eklemek indirilmeyi hak etmez. Hala alakalı, sanırım. Daha yeni kullanıcılara karşı nazik olun.
ARK

-2

Tabloyu şemadan silmek istiyorsanız aşağıdaki işlemi gerçekleştirin -

rails db:rollback
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.