Purge or recreate a Ruby on Rails database
我有一个充满数据的开发Ruby on Rails数据库。 我想删除所有内容并重建数据库。 我正在考虑使用类似的东西:
1 | rake db:recreate |
这可能吗?
我知道有两种方法可以做到这一点:
这将重置您的数据库并使用all重新加载当前架构:
1 | rake db:reset db:migrate |
这将破坏您的数据库,然后创建它,然后迁移您当前的模式:
1 | rake db:drop db:create db:migrate |
两种情况下都会丢失所有数据。
在Rails 4上,所有需要的都是
1 | $ rake db:schema:load |
这将删除数据库上的全部内容,并从schema.rb文件重新创建模式,而无需逐个应用所有迁移。
我在终端使用以下一个班轮。
1 | $ rake db:drop && rake db:create && rake db:migrate && rake db:schema:dump && rake db:test:prepare |
我把它作为shell别名并命名为
到现在为止,您可以轻松地"链接"Rails任务:
1 | $ rake db:drop db:create db:migrate db:schema:dump db:test:prepare # db:test:prepare no longer available since Rails 4.1.0.rc1+ |
更新:在Rails 5中,可以通过以下命令访问此命令:
从最新的rails 4.2版本开始,您现在可以运行:
1 | rake db:purge |
来源:提交
1 2 3 4 | # desc"Empty the database from DATABASE_URL or config/database.yml for the current RAILS_ENV (use db:drop:all to drop all databases in the config). Without RAILS_ENV it defaults to purging the development and test databases." task :purge => [:load_config] do ActiveRecord::Tasks::DatabaseTasks.purge_current end |
它可以像上面提到的一起使用:
1 | rake db:purge db:create db:migrate RAILS_ENV=test |
根据您的需要,您可以使用......
...从头开始从
...从头开始从
只需发出以下步骤:删除数据库,然后重新创建数据库,迁移数据,如果有种子,则播种数据库:
1 | rake db:drop db:create db:migrate db:seed |
由于
1 | RAILS_ENV=test rake db:drop db:create db:migrate |
在大多数情况下,测试数据库是在测试过程中播种的,因此不需要传递
1 | rake db:test:prepare |
要么
1 | RAILS_ENV=test rake db:seed |
此外,要使用重新创建任务,您可以将以下代码添加到Rakefile中:
1 2 3 4 5 6 7 | namespace :db do task :recreate => [ :drop, :create, :migrate ] do if ENV[ 'RAILS_ENV' ] !~ /test|cucumber/ Rake::Task[ 'db:seed' ].invoke end end end |
然后发出:
1 | rake db:recreate |
用得像
1 | rake db:drop db:create db:migrate db:seed |
全部在一条线上。这更快,因为环境不会一次又一次地重新加载。
db:drop - 将丢弃数据库。
db:create - 将创建数据库(host / db / password将取自config / database.yml)
db:migrate - 将从目录(db / migration / .rb)*运行现有迁移。
db:seed - 将从目录(db / migration / seed.rb)运行种子数据。
我通常喜欢:
1 | rake db:reset |
一次做所有。
干杯!
从命令行运行
1 | rake db:migrate:reset |
你可以手动做:
1 2 3 | rake db:drop rake db:create rake db:migrate |
或者只是
另一个细微差别是
在所有情况下,您的数据都会被吹走。
您可以使用以下命令行:
1 | rake db:drop db:create db:migrate db:seed db:test:clone |
在rails 4.2上,删除所有数据但保留数据库
1 | $ bin/rake db:purge && bin/rake db:schema:load |
https://github.com/rails/rails/blob/4-2-stable/activerecord/CHANGELOG.md
要删除特定数据库,可以在rails控制台上执行此操作:
1 2 3 4 | $rails console Loading development environment 1.9.3 > ActiveRecord::Migration.drop_table(:<table_name>) 1.9.3 > exit |
然后再次迁移DB
1 | $bundle exec rake db:migrate |
您可以使用
依赖于你想要使用exists schema.rb
根据Rails指南,应该使用这一个内核,因为它将从
1 | rake db:reset |
3个选项,结果相同:
1.所有步骤:
1 2 3 4 | $ rake db:drop # deletes the database for the current env $ rake db:create # creates the database for the current env $ rake db:schema:load # loads the schema already generated from schema.rb / erases data $ rake db:seed # seed with initial data |
2.重置:
1 | $ rake db:reset # drop / schema:load / seed |
3.迁移:重置:
1 2 | $ rake db:migrate:reset # drop / create / migrate $ rake db:seed |
笔记:
- 如果使用schema:load比执行所有迁移更快,但结果相同。
- 所有数据都将丢失。
- 您可以在一行中运行多个耙子。
- 适用于导轨3。
因为在开发过程中,您总是希望重新创建数据库,您可以在lib / tasks文件夹中定义rake任务。
1 2 3 4 | namespace :db do task :all => [:environment, :drop, :create, :migrate] do end end |
在终端你会跑
1 | rake db:all |
它将重建您的数据库
我认为运行此命令的最佳方法是:
1 2 | **rake db:reset** it does db:drop, db:setup rake db:setup does db:create, db:schema:load, db:seed |
只需你可以跑
如果您使用某些数据创建种子文件,它将删除数据库,创建新数据库并从种子填充数据库。
我今天对我的rails架构做了很多改动。我意识到我需要在层次结构中另外添加两个模型,而另一些模型则需要删除。模型和控制器需要进行许多微小的更改。
我添加了两个新模型并使用以下方法创建它们:
1 | rake db:migrate |
然后我编辑了schema.rb文件。我手动删除了不再需要的旧模型,根据需要更改了外键字段,只是重新排序了一下,让我更清楚。我删除了所有迁移,然后通过以下方式重新运行构建:
1 | rake db:reset |
它工作得很好。当然,所有数据都必须重新加载。 Rails意识到迁移已被删除并重置高水位标记:
1 | -- assume_migrated_upto_version(20121026094813, ["/Users/sean/rails/f4/db/migrate"]) |