发布于 2026-01-06 4 阅读
0

如何正确使用 rake db 命令

如何正确使用 rake db 命令

Rake是Ruby 和 Rails内置的一个实用工具,它提供了一种高效的方式来管理数据库变更。您只需使用命令行即​​可轻松地将数据库变更迁移到服务器!

在应用程序开发过程中,您可能会问自己:

  • 使用rake 数据库命令时会发生什么
  • 我应该在什么情况下使用它们?

让我们来看看如何在开发应用程序时使用这些命令来更改数据库!

创建

$ rake db:create
首次创建Rails 应用 时,它还没有数据库。为了使其能够启动,您需要确保数据库已启动并运行。

就像建议为每个环境使用不同的 gem一样,你也应该创建三个数据库,分别用于开发测试生产环境。你可以在配置文件中进行配置config/database.yml

default: &default
  adapter: postgresql
  encoding: unicode
  username: username
  password: password
  host: localhost
  port: 5432

development:
  <<: *default
  database: story_dev

test:
  <<: *default
  database: story_test

production:
  <<: *default
  database: story

迁移

rake db:migrate
迁移操作会在数据库中创建表。运行迁移命令时,它会查找db/migrate/所有 Ruby 文件,并从最早的文件开始执行。每个迁移文件名开头都有一个时间戳。

每次迁移数据库或对其进行任何更改(例如添加行或列、添加表或更改数据类型)时,都必须运行此命令才能使更改反映到数据库中。Rails应用程序中的数据库 Rake 任务列表

当您运行类似rails generate scaffoldrails generate model或 之类的命令时,就会创建迁移rails generate migration

以下是上传图片rake db:migrate时的使用示例。请确保迁移文件中不要创建数据!

初始化

rake db:schema:load
rake db:migrate与运行尚未运行的迁移 不同,rake db:schema:load它会将已生成的模式加载db/schema.rb到数据库中。

以下情况务必使用此命令:

  • 您首次运行该应用程序
  • 当你删除数据库后需要重新创建它时。

注意!如果在生产服务器上运行rake db:schema:load,最终会删除所有生产数据。

播种

rake db:seed
为了测试目的,我们总会在应用程序中保留一些默认数据。seed命令的作用就是自动化这个过程。

例如:创建一个管理员用户并将其数据存储在db/seed.rb文件中。运行时,rake db:seed它会将所有管理员数据加载到您的应用程序中。

Admin.create!(email: 'admin@kolosek.com', 
              password: 'password', 
              password_confirmation: 'password')

Rails 的种子用户填充功能通常用于开发和/或测试环境,在生产环境中只有极少数用途。你肯定不希望你的生产应用程序使用虚拟用户进行种子填充!

回滚

rake db:rollback
你是否不小心创建了迁移,或者只是改变了主意?别担心!运行此命令后,它将查找并撤销最后创建的迁移!

例如:我们先创建一个新的迁移,并将参数设置:role为整​​数并运行它。然后我们决定将其改为字符串。因此,我们编辑新创建的迁移并再次运行它,但没有任何反应,并且您的测试和工厂都会失败。

class CreateRoles < ActiveRecord::Migration
  def change
    create_table :roles do |t|
      t.integer :role # we will change this to t.string :role
      t.references :user
      t.timestamps
    end
  end
end

为什么这个命令不起作用?
它只会运行最后创建的迁移rake db:migrate文件。这意味着编辑已存在的迁移文件不会产生任何更改。要使其生效,您需要运行rake db:rollback以下命令。这将告诉 Rails 执行两项操作:

  1. 撤销您刚刚对数据库所做的最后更改。
  2. 更新迁移时间戳。## 删除rake db:drop有时我们需要删除所有数据和表,然后从头开始。这就是此命令rake db:drop的用途。如果您想保留现有数据,请务必在运行此命令之前备份数据。

删除数据库还会清除任何模式冲突错误数据。数据库删除后,您需要重新创建数据库、运行迁移并填充数据,从而重新启动整个流程。请务必确保在重建数据库后,您的RSpec 测试能够通过!

请确保没有与数据库建立连接,否则不会断开连接。

重置

rake db:reset
有时您可能需要删除本地数据库,然后从外部加载数据重新开始db/seeds.rb。当您仍在确定数据库模式,并且经常需要向现有模型添加字段时,此命令非常有用。

使用重置命令后,它将执行以下操作:

  1. 删除数据库:rake db:drop
  2. 加载模式:rake db:schema:load
  3. 输入种子数据:rake db:seed


rake db:schema:load为什么使用db:schema:load 而不是 db:migrate?rake db:migrate因为它加载的是我们已经生成的 schema,db/schema.rb而不是再次执行所有迁移。

希望这能帮助你理解 rake 数据库命令之间的主要区别!

本文最初发表于Kolosek Blog

文章来源:https://dev.to/neshaz/how-to-use-rake-db-commands-in-the- Correct-way--50o2