gpt4 book ai didi

ruby-on-rails - Ruby on Rails 5.0 升级与迁移用户表冲突

转载 作者:搜寻专家 更新时间:2023-10-30 20:25:11 24 4
gpt4 key购买 nike

从 4.2 升级到 Rails 5.0 后,出现以下错误:

rails db:migrate
== 20160703164716 AddDeviseToUsers: migrating =================================
-- change_table(:users)
rails aborted!
StandardError: An error has occurred, this and all later migrations canceled:

PG::DuplicateColumn: ERROR: column "email" of relation "users" already exists
: ALTER TABLE "users" ADD "email" character varying DEFAULT '' NOT NULL
/Users/my_username/.rvm/gems/ruby-2.3.0/gems/activerecord-5.0.0/lib/active_record/connection_adapters/postgresql/database_statements.rb:98:in `async_exec'
/Users/my_username/.rvm/gems/ruby-2.3.0/gems/activerecord-5.0.0/lib/active_record/connection_adapters/postgresql/database_statements.rb:98:in `block in execute'

阅读以下两篇 Stack Overflow 帖子后:

PGError: ERROR: column “email” of relation “users” already exists

Devise migration on existing model

我的问题是解决与用户表发生的数据库冲突的最佳方法是什么?

最好是编辑现有的迁移文件,例如 20160703164716 AddDeviseToUsers 迁移,还是建议进行新的迁移?

在我的开发环境和基于 Heroku 的生产环境中,进行新迁移的命令是什么?此迁移的最佳名称是什么?

def self.up
change_table(:users) do |t|
t.recoverable
t.trackable
# rememberable uses remember_token, but this field is different
t.rename :remember_token_expires_at, :remember_created_at
# these fields are named differently in devise
t.rename :crypted_password, :encrypted_password
end
end

以上是第二篇文章建议的建议代码。

您将如何使用这段代码并从中进行新的迁移?

研究迁移后,我进行了以下迁移:

rails g migration change_data_type_for_users

生成一个新的迁移,我根据我的理解编辑了上面的错误,建议在用户字段中修复。新的迁移代码:

class ChangeDataTypeForUsers < ActiveRecord::Migration[5.0]
def change
change_table(:users) do |t|
t.string :email, :null => false, :default => ""
end
end

运行 rails db:migrate 后,我收到同样的错误。我究竟做错了什么?我现在应该回滚还是编辑新的迁移?

后来我找到了这篇 Stack Overflow 文章。 ( Rails 4 Ruby 2.00 Devise migration on existing User Model fails )这是正确的道路吗?删除数据库会删除所有数据库数据吗?

这里的另一个发现让我相信执行 rake db:reset 是否会破坏我数据库中的数据。这样做会重新创建数据库吗?目前还不清楚,从下面的帖子来看,如果所有数据都被销毁,那将是非常有害的。我们只想固定一个表中的一个字段。

( Difference between rake db:migrate db:reset and db:schema:load )

我真的想回答我自己的问题,所以也许这个模型对用户模型有所不同,它似乎是由 ActiveAdmin 创建的:

class AdminUser < ApplicationRecord
# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable and :omniauthable
devise :database_authenticatable,
:recoverable, :rememberable, :trackable, :validatable
end

最佳答案

在您的情况下,请记住您正在尝试更改数据库中存在的列,您这样做的方式就像您正在创建一个新列一样。

t.string :email, :null => false, :default => ""

您可以将该行更改为

t.change :email, :string, :null => false, :default => ""

在你的 block 内,知道“t”是你的用户表

关于ruby-on-rails - Ruby on Rails 5.0 升级与迁移用户表冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38193075/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com