【发布时间】:2012-10-31 22:37:16
【问题描述】:
我创建了一个名为“users”的模型,并创建了一个新迁移以向 users 表添加一些列。现在,当我运行 rake db:migrate 时,我在 b/c 下面得到错误,它正在尝试再次创建用户表
$ rake db:migrate
== DeviseCreateUsers: migrating ==============================================
-- create_table(:users)
rake aborted!
An error has occurred, all later migrations canceled:
Mysql::Error: Table 'users' already exists: CREATE TABLE `users`.....
为什么要再次创建表?
这是我用来创建新迁移的命令
$ rails generate migration AddDetailsToUsers home_phone:decimal cell_phone:decimal work_phone:decimal birthday:date home_address:text work_address:text position:string company:string
新的迁移如下所示:
class AddDetailsToUsers < ActiveRecord::Migration
def change
add_column :users, :home_phone, :decimal
add_column :users, :cell_phone, :decimal
add_column :users, :work_phone, :decimal
add_column :users, :birthday, :date
add_column :users, :home_address, :text
add_column :users, :work_address, :text
add_column :users, :position, :string
add_column :users, :company, :string
end
end
编辑
20120511224920_devise_create_users
class DeviseCreateUsers < ActiveRecord::Migration
def change
create_table(:users) do |t|
## Database authenticatable
t.string :email, :null => false, :default => ""
t.string :username, :null => false, :default => ""
t.string :encrypted_password, :null => false, :default => ""
## Recoverable
t.string :reset_password_token
t.datetime :reset_password_sent_at
## Rememberable
t.datetime :remember_created_at
## Trackable
t.integer :sign_in_count, :default => 0
t.datetime :current_sign_in_at
t.datetime :last_sign_in_at
t.string :current_sign_in_ip
t.string :last_sign_in_ip
## Encryptable
# t.string :password_salt
## Confirmable
# t.string :confirmation_token
# t.datetime :confirmed_at
# t.datetime :confirmation_sent_at
# t.string :unconfirmed_email # Only if using reconfirmable
## Lockable
# t.integer :failed_attempts, :default => 0 # Only if lock strategy is :failed_attempts
# t.string :unlock_token # Only if unlock strategy is :email or :both
# t.datetime :locked_at
## Token authenticatable
# t.string :authentication_token
t.timestamps
end
add_index :users, :email, :unique => true
add_index :users, :reset_password_token, :unique => true
# add_index :users, :confirmation_token, :unique => true
# add_index :users, :unlock_token, :unique => true
# add_index :users, :authentication_token, :unique => true
end
end
20120619023856_add_name_to_users
class AddNameToUsers < ActiveRecord::Migration
def change
add_column :users, :first_name, :string
add_column :users, :last_name, :string
end
end
20121031174720_add_details_to_users.rb
class AddDetailsToUsers < ActiveRecord::Migration
def change
add_column :users, :home_phone, :decimal
add_column :users, :cell_phone, :decimal
add_column :users, :work_phone, :decimal
add_column :users, :birthday, :date
add_column :users, :home_address, :text
add_column :users, :work_address, :text
add_column :users, :position, :string
add_column :users, :company, :string
end
end
【问题讨论】:
-
从输出看来,错误发生在 DeviseCreateUsers 期间,而不是在您的新迁移中。您是否有另一个(旧)迁移已经创建了 Users 表?
-
是的,我愿意。但我认为我应该能够像我一样添加一个新的迁移,并且运行 rake db:migrate 应该只运行当前尚未运行的迁移。
-
新的迁移甚至没有运行;似乎您还有另外两个都尝试创建用户表(
DeviseCreateUsers和较旧的迁移)。您可能应该将DeviseCreateUsers更改为使用add_columns 而不是尝试创建表。 -
我有 3 个迁移,只有一个有创建用户声明,另外 2 个包含添加列。我已经用我的 3 个迁移文件编辑了这个问题。
-
好的.. 您发布的迁移运行得非常好。
rake db:drop && rake db:migrate有效吗?如果您需要数据,请先备份您的数据库..
标签: ruby-on-rails ruby ruby-on-rails-3 migration