我将create table
的迁移文件更改为add column
。
这是原始迁移文件的一部分。
create_table(:users) do |t|
t.string :provider, :null => false
t.string :uid, :null => false, :default => ""
这是我写的。
add_column :users, :provider, :string, :null => false
add_column :users, :uid, :string, :null => false, :default => ""
这是我在运行迁移时遇到的错误。如何更正迁移文件?
== 20150527155909 DeviseTokenAuthCreateUsers: migrating =======================
-- add_column(:users, :provider, :string, {:null=>false})
rake aborted!
StandardError: An error has occurred, this and all later migrations canceled:
PG::NotNullViolation: ERROR: column "provider" contains null values
: ALTER TABLE "users" ADD "provider" character varying NOT NULL/***/db/migrate/20150527155909_devise_token_auth_create_users.rb:3:in `change'
ActiveRecord::StatementInvalid: PG::NotNullViolation: ERROR: column "provider" contains null values
: ALTER TABLE "users" ADD "provider" character varying NOT NULL
/home/***/db/migrate/20150527155909_devise_token_auth_create_users.rb:3:in `change'
PG::NotNullViolation: ERROR: column "provider" contains null values
/home/***/db/migrate/20150527155909_devise_token_auth_create_users.rb:3:in `change'
Tasks: TOP => db:migrate
(See full trace by running task with --trace)
答案 0 :(得分:1)
您正在尝试更新提供程序和uid列以不允许空值,并且您已正确编写了迁移。出现此错误是因为其中一个或多个(至少是提供程序)已包含具有空值的记录。您必须使用空提供程序和/或uid删除记录,或者在它工作之前更新它们的值(从null到#34;")。
注意强> 如果您想轻松更新这些记录,并且安全性不会阻止您,您只需打开rails控制台并执行以下操作:
users = User.all
users.each do |u|
u[:provider] = ""
u[:uid] = ""
u.save
end
有很多事情可以阻止这种情况发生,它可能没有你想要的结果,但它是一种选择。