Rails DB迁移-如何删除一个表?

我添加了一个我认为我将需要的表格,但现在不再计划使用它。我该如何移除那张桌子?

我已经运行了迁移,所以这个表在我的数据库中。我认为rails generate migration应该能够处理这个问题,但我还没有弄清楚如何处理。

我试过了:

rails generate migration drop_tablename

但这只是产生了一个空迁移。

在Rails中删除表的“官方”方式是什么?

453831 次浏览

您并不总是能够简单地生成迁移来拥有您想要的代码。您可以创建一个空迁移,然后用您需要的代码填充它。

你可以在这里找到关于如何在迁移中完成不同任务的信息:

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

更具体地说,你可以看到如何使用以下方法删除一个表:

drop_table :table_name

我认为,为了完全“正式”,你需要创建一个新的迁移,并把drop_table放在self.up中。自我。方法应该包含完整地重新创建表的所有代码。假定代码可以从模式中提取。Rb在你创建迁移的时候。

添加代码来创建一个您知道不再需要的表,这似乎有点奇怪,但这将保持所有迁移代码的完整和“正式”,对吗?

我只是对我需要放下的桌子做了这样的操作,但老实说,我没有测试“放下”,也不确定我为什么要这么做。

首先,生成一个具有任意名称的空迁移。这样做很重要,因为它创建了适当的日期。

rails generate migration DropProductsTable

这将在/db/migrate/目录下生成一个。rb文件,如20111015185025_drop_products_table.rb

现在编辑该文件,如下所示:

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


def down
raise ActiveRecord::IrreversibleMigration
end
end

我唯一添加的东西是drop_table :productsraise ActiveRecord::IrreversibleMigration

然后运行rake db:migrate,它将为您删除表。

警告:这样做的风险由你自己承担,正如@z-atef和@nzifnab正确指出的那样,Rails不会意识到这些更改,你的迁移序列填充失败,你的模式将与你的同事的不同。这仅仅是为当地的发展修修补补提供资源。


虽然这里提供的答案工作正常,我想要一些更“直接”的东西,我发现它在这里:链接 首先输入rails控制台:

$rails console

然后输入:

ActiveRecord::Migration.drop_table(:table_name)

完成了,为我工作了!

打开rails控制台

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

我需要删除我们的迁移脚本以及表本身……

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"

# EYZ0

您需要使用以下命令创建一个新的迁移文件

rails generate migration drop_table_xyz

并在新生成的迁移文件(db/migration/xxxxxxx_drop_table_xyz)中编写drop_table代码

drop_table :tablename

或者如果你想在不迁移的情况下删除表,只需打开rails控制台by

$ rails c

并执行以下命令

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

或者你可以使用更简单的命令

ActiveRecord::Migration.drop_table(:table_name)

手动编写迁移。例如,执行rails g migration DropUsers

至于迁移的代码,我将引用Maxwell Holder的帖子Rails迁移清单

坏-运行rake db:migraterake db:rollback将失败

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

GOOD -揭示了迁移不应该可逆的意图

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


def down
fail ActiveRecord::IrreversibleMigration
end
end

BETTER -实际上是可逆的

class DropUsers < ActiveRecord::Migration
def change
drop_table :users do |t|
t.string :email, null: false
t.timestamps null: false
end
end
end
  1. Rails迁移drop_users
  2. 编辑迁移
    class DropUsers < ActiveRecord::Migration
def change
drop_table :users do |t|
t.string :name
t.timestamps
end
end
end
  1. rake db: migrate

运行

rake db:migrate:down VERSION=<version>

<version>是您想要恢复的迁移文件的版本号。

例子:-

rake db:migrate:down VERSION=3846656238

你能做的最好的办法就是

rails g migration Drop_table_Users

然后执行以下操作

rake db:migrate

您可以简单地从rails控制台删除一个表。 首先打开控制台

$ rails c

然后将此命令粘贴到控制台

ActiveRecord::Migration.drop_table(:table_name)

table_name替换为要删除的表。

您也可以直接从终端删除表。只需输入应用程序的根目录并运行此命令

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

执行命令:-

rails g migration drop_table_name

然后:

rake db:migrate

或者如果你使用的是MySql数据库,那么:

  1. 登录数据库
  2. # EYZ0
  3. # EYZ0
  4. # EYZ0

你可以按照指南中的方式回滚一次迁移:

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

通过这种方式,您还可以回滚并用于恢复任何迁移

简单而正式的方式是这样的:

  rails g migration drop_tablename

现在转到您的db/migrate,并寻找包含drop_tablename作为文件名的文件,并将其编辑为此。

    def change
drop_table :table_name
end

那你就得跑

    rake db:migrate

在你的控制台。

替代引发异常或试图重新创建一个现在空的表-同时仍然启用迁移回滚,重做等-

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

删除表/迁移

< p >运行:- $ rails生成迁移DropTablename

$ rails生成迁移DropProducts

如果您想删除一个特定的表,您可以这样做

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

否则,如果您想删除所有数据库,您可以这样做

$rails db:drop

我不能让它与迁移脚本一起工作,所以我继续使用这个解决方案。使用终端进入rails控制台:

rails c

类型

ActiveRecord::Migration.drop_table(:tablename)

这对我来说很有效。这将删除前一个表。别忘了跑步

rails db:migrate

如果要从模式中删除表,请执行下面的操作——

rails db:rollback

如果有人在寻找如何在SQL中做到这一点。

从终端输入rails dbconsole

输入密码

在控制台做

# EYZ0

# EYZ0

# EYZ0

请不要忘记从模式中删除迁移文件和表结构

有用的文档

在迁移中,您可以通过以下方式删除表:

drop_table(table_name, **options)

选项:

< p > # EYZ0 设置为:cascade也可以删除依赖对象。默认为false

< p > # EYZ0 设置为true仅在表存在时删除它。默认为false

例子:

  1. 为删除表创建迁移,例如我们想删除User

    rails g migration DropUsers
    
    
    Running via Spring preloader in process 13189
    invoke  active_record
    create    db/migrate/20211110174028_drop_users.rb
    
  2. 编辑迁移文件,在我们的例子中是db/migrate/20211110174028_drop_users.rb

    class DropUsers < ActiveRecord::Migration[6.1]
    def change
    drop_table :users, if_exist: true
    end
    end
    
  3. 执行migration命令删除User

    rails db:migrate
    
    
    == 20211110174028 DropUsers: migrating ===============================
    -- drop_table(:users, {:if_exist=>true})
    -> 0.4607s
    
你不能简单地运行drop_table :table_name,相反,你可以通过运行以下命令创建一个空迁移: # EYZ0 < / p >

然后你可以把这个添加到空迁移中:

class DropInstalls < ActiveRecord::Migration
def change
drop_table :installs
end
end

然后在命令行中运行rails db:migrate,这将删除安装表 找到解决方案在这里