Answers:
我知道两种方法可以做到这一点:
这将重置您的数据库并重新加载当前架构:
rake db:reset db:migrate
这将破坏您的数据库,然后创建它,然后迁移您当前的模式:
rake db:drop db:create db:migrate
在这两种情况下,所有数据都将丢失。
rake db:reset
还运行所有迁移(至少在Rails 3上),因此应该只需要所有的内容,对吗?
rake db:test:prepare
以进行测试,否则会收到类似以下的错误:Could not find table 'things' (ActiveRecord::StatementInvalid)
rake db:reset
然后rake db:drop db:create db:migrate
做两件事。后者会清除整个应用程序数据库,然后重新创建它,然后进行每次迁移以更新架构(db/schema.rb
或db/structure.sql
),但不会用种子数据填充它。相反,第一个是的别名rake db:drop db:schema:load db:seed
,因此它会擦除整个应用程序数据库,但不会更新架构,然后填充种子数据。因此,如果您在迁移中没有进行任何更改,则前者会更快,后者会更安全。
在Rails 4上,所有需要的是
$ rake db:schema:load
这将删除数据库上的全部内容,并从schema.rb文件中重新创建模式,而不必一一应用所有迁移。
db:drop
并且db:create
是多余的。
我在终端中使用以下一种衬板。
$ rake db:drop && rake db:create && rake db:migrate && rake db:schema:dump && rake db:test:prepare
我将其作为外壳别名并命名为 remigrate
现在,您可以轻松地“链接” Rails任务:
$ 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+
db:reset
,而只需一个Google(或查看Guides)。我的评论并不是建议您不要使用它,而是要避免db:migrate
在您真正想要的是时使用db:schema:load
。
rake
,如下所示:rake db:drop db:create db:schema:load
。
db:migrate
…… 但是db:schema:load
对于忘记将schema.rb连同新迁移一起签入版本控制的人很敏感。
更新:在Rails 5中,可以通过以下命令访问此命令:
rails db:purge db:create db:migrate RAILS_ENV=test
从最新的rails 4.2版本开始,您现在可以运行:
rake db:purge
来源:提交
# 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
可以像上面提到的那样一起使用:
rake db:purge db:create db:migrate RAILS_ENV=test
db:purge
“删除所有数据,但保留所有表和列”
db:purge
没有保留表。
根据您的需求,可以使用…
rake db:create
…要从头开始构建数据库config/database.yml
,或者…
rake db:schema:load
…从schema.rb
文件的头开始构建数据库。
使用方式
rake db:drop db:create db:migrate db:seed
合而为一。由于环境不会一次又一次地重新加载,因此速度更快。
db:drop-将删除数据库。
db:create-将创建数据库(主机/数据库/密码将从config / database.yml中获取)
db:migrate-将运行目录(db / migration / .rb)*中的现有迁移。
db:seed-将运行可能来自目录(db / migration / seed.rb)的种子数据。
我通常更喜欢:
rake db:reset
一次完成所有操作。
干杯!
db:reset == db:drop + db:schema:load + db:seed
,db:migrate:reset == db:drop + db:create + db:migrate
只需执行以下步骤顺序:删除数据库,然后再次重新创建它,迁移数据,如果有种子,则播种数据库:
rake db:drop db:create db:migrate db:seed
由于默认的环境rake
是development,因此如果您在规格测试中看到异常,则应为测试环境重新创建db,如下所示:
RAILS_ENV=test rake db:drop db:create db:migrate
在大多数情况下,测试数据库是在测试过程中播种的,因此db:seed
不需要通过任务操作。否则,您应准备数据库:
rake db:test:prepare
要么
RAILS_ENV=test rake db:seed
此外,要使用重新创建任务,可以将以下代码添加到Rakefile中:
namespace :db do
task :recreate => [ :drop, :create, :migrate ] do
if ENV[ 'RAILS_ENV' ] !~ /test|cucumber/
Rake::Task[ 'db:seed' ].invoke
end
end
end
然后发出:
rake db:recreate
在rails 4.2上,删除所有数据但保留数据库
$ bin/rake db:purge && bin/rake db:schema:load
https://github.com/rails/rails/blob/4-2-stable/activerecord/CHANGELOG.md
您可以将
db:reset
-用于运行db:drop和db:setup或
db:migrate:reset
-用于运行db:drop,db:create和db:migrate。
依赖于您要使用的存在schema.rb
因为在开发中,您将一直想重新创建数据库,所以您可以在lib / tasks文件夹中定义一个rake任务。
namespace :db do
task :all => [:environment, :drop, :create, :migrate] do
end
end
在终端中,您将运行
rake db:all
它将重建您的数据库
只需运行即可
rake db:setup
如果您使用一些数据创建种子文件,它将删除数据库,创建新数据库并从种子中填充db。
3个选项,相同的结果:
1.所有步骤:
$ 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.重置:
$ rake db:reset # drop / schema:load / seed
3.迁移:重置:
$ rake db:migrate:reset # drop / create / migrate
$ rake db:seed
笔记:
今天,我对Rails模式进行了很多更改。我意识到我需要在层次结构中再添加两个模型,并删除其他一些模型。对模型和控制器的更改很少。
我使用以下方法添加了两个新模型并创建了它们:
rake db:migrate
然后,我编辑了schema.rb文件。我手动删除了不再需要的旧模型,根据需要更改了外键字段,并对其进行了重新排序以使其更清楚。我删除了所有迁移,然后通过以下方式重新运行构建:
rake db:reset
效果很好。当然,所有数据都必须重新加载。Rails意识到迁移已被删除并重置了高水位标记:
-- assume_migrated_upto_version(20121026094813, ["/Users/sean/rails/f4/db/migrate"])
rake db:drop db:create db:schema:load
可能比rake db:drop db:create db:migrate
(尽管我已经准备好在这方面做错了)更合适。