新手学Rails,如何设置数据库并运行rake db:create/migrate命令

33

你好,我目前正在学习Rails并跟随教程。教程指导我在创建应用程序后编辑迁移文件,然后运行rake db:migrate和rake db:create。

我已将迁移文件编辑为以下内容:

class CreateUsers < ActiveRecord::Migration
  def change
    create_table :users do |t|
      t.string :username
      t.string :email
      t.string :encrypted_password
      t.string :salt
      t.timestamps
    end
  end
end

当我运行 'rake db:migrate' 时,出现了错误。
Mysql2::Error: Table 'users' already exists: CREATE TABLE `users` ...

在我应该运行 'rake db:create' 之后,我得到了以下错误信息:

user_auth_development already exists
user_auth_test already exists

我需要运行 db:create 和 db:migrate 吗?还是我编辑迁移文件后已经设置好了? - Harvey Katrina
它意味着该表已经存在。可能先前的迁移已经创建了它。 - rails_id
4个回答

58

你只需要运行一次 rake db:create,并且首先运行它。然后每次添加/更改迁移时都要运行 rake db:migrate。你可能已经运行了这个迁移,或者你正在指向一个已经存在且已经包含名为 users 的表的数据库。我猜测你已经运行过这个迁移了,如果是这样的话,你可能可以继续使用。如果你想清除数据库并重新开始,请执行 rake db:drop db:create db:migrate


非常感谢!我不知道为什么指南中没有涵盖这个问题。它也没有解释如何正确更新迁移。当我更新迁移文件并运行rake db:migrate时,什么都没有发生。我知道我做错了什么,但我不知道应该做什么。我是否需要给迁移命名一个新名称或其他什么? - Nathan
1
一般来说,你不应该修改迁移文件。如果你真的知道自己在做什么,你就会知道什么时候可以接受修改。如果你有任何疑虑,请不要修改;相反,创建一个新的迁移文件(rails generate migration)。这里有一个小例外:如果您想修改最近的迁移,您可以这样做,然后运行rake db:migrate:redo,它将删除并重新运行上一个迁移。这并不总是可行的; 这取决于最后一个迁移是否可逆(并非所有迁移都是可逆的)。如果你已经将其提交到共享仓库中,就不应该这样做。 - Jim Stewart
它没有执行任何操作的原因是因为Rails会跟踪已经运行的迁移。它创建了一个名为“schema_migrations”的表,其中包含迁移时间戳的列表(迁移名称的初始数字部分)。它不会重新运行已经记录在那里的迁移。这就是它在运行“rake db:migrate”时知道要应用哪些迁移的方式。 - Jim Stewart

21

我们可以简单地使用rake db:setup命令,它会执行所有必需的任务,包括数据库创建和迁移。


一直在寻找那个简单的信息...似乎太琐碎了,很难找到。它将从模型生成数据库。 - nembleton

1

对于Rails 5和6,命令为:

rails setup

这将会 "创建数据库,加载模式,并使用种子数据进行初始化" (文档)。

4
也许是 rails db:setup - MonsieurDart

0

对于 Rails 6 及以上版本,您可以使用以下命令来 创建 数据库、迁移 所有迁移文件并将数据 填充 到数据库中:

rails db:prepare

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接