我有一个充满数据的开发 Ruby on Rails 数据库。我想删除所有内容并重建数据库。我正在考虑使用类似的东西:
rake db:recreate
这可能吗?
rake db:drop db:create db:schema:load
可能比 rake db:drop db:create db:migrate
更合适(尽管我已经准备好错了)。
rake db:drop db:create db:migrate
db:drop + db:create + db:migrate == db:migrate:reset
。当迁移被破坏时,我通常会求助于 db:schema:load
。我很少需要重新创建数据库,所以速度并不重要。此外,如果您有未应用的迁移,db:schema:load
和 db:reset
将不会应用它们。不确定这是否是一个很大的争论。
我知道两种方法可以做到这一点:
这将重置您的数据库并重新加载您当前的架构:
rake db:reset db:migrate
这将破坏您的数据库,然后创建它,然后迁移您当前的架构:
rake db:drop db:create db:migrate
在这两种情况下,所有数据都将丢失。
在 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
我把它作为一个 shell 别名并将它命名为 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
,这只是一个谷歌(或检查 Guides)。我的评论不是建议不要使用它,而是要避免在您真正想要的是 db:schema:load
时使用 db:migrate
。
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
来源:commit
# 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:migrate:reset
schema.rb
,如果您只有 drop
和 create
,migrate
将什么都不做(在 rails 6 上测试)
使用喜欢
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) 运行种子数据..
我通常更喜欢:
rake db:reset
一次做所有事情。
干杯!
db:reset == db:drop + db:schema:load + db:seed
、db:migrate:reset == db:drop + db:create + db:migrate
在 Rails 6 中,有一种方便的方法可以重置 DB 并再次播种:
rails db:seed:replant # Truncates tables of each database for current environment and loads the seeds
只需发布步骤顺序:删除数据库,然后重新创建它,迁移数据,如果有种子,则播种数据库:
rake db:drop db:create db:migrate db:seed
由于 rake
的默认环境是 development,如果您在规范测试中看到异常,您应该为 test 环境重新创建 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
您可以手动执行:
rake db:drop
rake db:create
rake db:migrate
或者只是 rake db:reset
,它将运行上述步骤,但也会运行您的 db/seeds.rb
文件。
另一个细微差别是 rake db:reset
直接从您的 schema.rb
文件加载,而不是再次运行所有迁移文件。
在所有情况下,您的数据都会被吹走。
您可以使用以下命令行:
rake db:drop db:create db:migrate db:seed db:test:clone
要删除特定数据库,您可以在 rails 控制台上执行此操作:
$rails console
Loading development environment
1.9.3 > ActiveRecord::Migration.drop_table(:<table_name>)
1.9.3 > exit
然后再次迁移数据库
$bundle exec rake db:migrate
在 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:reset** it does db:drop, db:setup
rake db:setup does db:create, db:schema:load, db:seed
简单地你可以运行
rake db:setup
如果您使用一些数据创建种子文件,它将删除数据库,创建新数据库并从种子填充数据库。
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
笔记:
如果使用 schema:load 比进行所有迁移更快,但结果相同。
所有数据都将丢失。
您可以在一行中运行多个 rake。
适用于导轨 3。
我今天对我的 Rails 架构进行了很多更改。我意识到我需要在层次结构中增加两个模型,并删除其他一些模型。模型和控制器需要进行许多小改动。
我添加了两个新模型并创建了它们,使用:
rake db:migrate
然后我编辑了 schema.rb 文件。我手动删除了不再需要的旧模型,根据需要更改了外键字段,然后对其进行了重新排序以使我更清楚。我删除了所有迁移,然后通过以下方式重新运行构建:
rake db:reset
它工作得很好。当然,所有数据都必须重新加载。 Rails 意识到迁移已被删除并重置高水位线:
-- assume_migrated_upto_version(20121026094813, ["/Users/sean/rails/f4/db/migrate"])
我用:
rails db:drop 删除数据库。
rails db:create 根据 config/database.yml 创建数据库
前面的命令可以用 rails db:reset
代替。
不要忘记运行 rails 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
的别名,因此它会清除整个应用程序数据库,但它不更新架构,然后填充种子数据。因此,如果您在迁移中没有更改任何内容,则第一个更快,后者更安全。