检查Rails中是否存在表

the*_*gah 168 ruby ruby-on-rails rails-migrations rails-activerecord

我有一个rake任务,除非存在一个表,否则它将无效.我正在一个网站上与20多名工程师一起工作,所以我想确保他们已经迁移了表,然后才能执行一个rake任务,该任务将填充相应的表.

AR有这样的方法Table.exists吗?如何确保他们已成功迁移表?

cap*_*ete 296

在Rails 5中,API变得明确关于表/视图,统称数据源.

# Tables and views
ActiveRecord::Base.connection.data_sources
ActiveRecord::Base.connection.data_source_exists? 'kittens'

# Tables
ActiveRecord::Base.connection.tables
ActiveRecord::Base.connection.table_exists? 'kittens'

# Views
ActiveRecord::Base.connection.views
ActiveRecord::Base.connection.view_exists? 'kittens'
Run Code Online (Sandbox Code Playgroud)

在Rails 2,3和4中,API是关于表的.

# Listing of all tables and views
ActiveRecord::Base.connection.tables

# Checks for existence of kittens table/view (Kitten model)
ActiveRecord::Base.connection.table_exists? 'kittens'
Run Code Online (Sandbox Code Playgroud)

获取迁移状态:

# Tells you all migrations run
ActiveRecord::Migrator.get_all_versions

# Tells you the current schema version
ActiveRecord::Migrator.current_version
Run Code Online (Sandbox Code Playgroud)

如果您需要更多用于迁移或元数据的API,请参阅:

  • 如果table_exists,这适用于ActiveRecord 3.2.11`drop_table(:hosts_users)?:hosts_users` (14认同)
  • `ActiveRecord :: Base.connection.table_exist'users'`将检查用户表. (4认同)
  • `的ActiveRecord :: Base.connection.table_exists?'小猫`会检查一张小猫桌子.除非我摧毁所有小猫!`drop_table:小猫` (4认同)

ale*_*cat 55

即使表不存在:

型号Kitten,预期表kittens 栏3:

Kitten.table_exists?#=> false

  • 确认这适用于 Rails 2.3.18-lts(在运行脚本/控制台之前测试了一张表,一张表缺失) (2认同)

kan*_*kyu 32

我在尝试通过迁移删除表时发现了这个问题:

drop_table :kittens if (table_exists? :kittens)
ActiveRecord::Migration.drop_table :kittens if (ActiveRecord::Base.connection.table_exists? :kittens)
Run Code Online (Sandbox Code Playgroud)

适用于Rails 3.2

这个更简单的形式将在Rails 5中提供:

drop_table :kittens, if_exists: true
Run Code Online (Sandbox Code Playgroud)

参考:https://github.com/rails/rails/pull/16366

这是Rails 5 ActiveRecord的CHANGELOG:

为drop_table引入:if_exists选项.

例:

drop_table(:posts, if_exists: true)
Run Code Online (Sandbox Code Playgroud)

那会执行:

DROP TABLE IF EXISTS posts
Run Code Online (Sandbox Code Playgroud)

如果表不存在,则if_exists:false(默认值)引发异常,而if_exists:true不执行任何操作.


Vit*_*ira 7

Rails 5.1

if ActiveRecord::Base.connection.data_source_exists? 'table_name'
   drop_table :table_name
end
Run Code Online (Sandbox Code Playgroud)

要么

drop_table :table_name, if_exists: true
Run Code Online (Sandbox Code Playgroud)

  • table_exists仍可在rails-5中运行,但其行为将更改为仅检查表.从5.0.1开始,它检查视图和表.data_source_exists保持该行为,table_exists将更改为仅检查表. (2认同)