代码之家  ›  专栏  ›  技术社区  ›  Emma O.

在尝试部署Rails应用程序时,使用MySql时出现了重复的列名错误

  •  0
  • Emma O.  · 技术社区  · 6 年前
    ActiveRecord::StatementInvalid: Mysql2::Error: Duplicate column name 'first_name': ALTER TABLE `users` ADD `first_name` varchar(255)
    

    这是我在尝试使用ShipIt部署Rails应用程序时收到的错误。

    我的问题是:如何解决此错误?

    我使用名为name的属性启动应用程序,然后在下面的迁移中将name分为first\u name和last\u name。当我重置数据库(rails db:reset)时,一切正常。当我删除数据库、创建数据库、迁移更改并手动设置种子时,一切看起来都很好。我的架构似乎只包含我想要的数据。我很困惑。当我使用sql和rails查询表时,列看起来很好。

     /app/db/migrate/20180507080705_break_up_fullname_in_users.rb:3:in `up'
    

    这就是造成错误的原因。

    这是导致错误的整个迁移过程:

    class BreakUpFullnameInUsers < ActiveRecord::Migration[5.2]
      def up
      add_column :users, :first_name, :string
      add_column :users, :last_name, :string
    
      User.all.each do |user|
        fn, ln = name.split(' ', 2)
        user.update(first_name: fn, last_name: ln)
      end
    
      remove_column :users, :name
     end
    
    
      def down
        add_column :users, :name, :string
    
       User.all.each do |user|
         n = [name.first_name, name.last_name].join(' ')
         user.update(name: n)
       end
    
        remove_column :users, :first_name
        remove_column :users, :last_name
      end
    
    end
    

    这是创建表的原始迁移:

    class CreateUsers < ActiveRecord::Migration[5.2]
     def change
      create_table :users do |t|
       t.string :email
       t.string :name
       t.string :username
       t.string :password_digest
    
       t.timestamps
      end
     end
    end
    

    这是在“用户”下的“我的架构文件”中的“我的”:

    create_table "users", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t|
     t.string "email"
     t.string "username"
     t.string "password_digest"
     t.datetime "created_at", null: false
     t.datetime "updated_at", null: false
     t.string "first_name"
     t.string "last_name"
     t.boolean "admin", default: false
    end
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   Satishakumar Awati    6 年前

    由于列 first\u名称 last\u姓名 已添加/提交到数据库中的表。还有 名称 已删除users表中的列。

    迁移执行已经完成,rails无法在中更新迁移版本 schema\u迁移 表可能是因为代码正在从名称字段将数据更新为两列first\u name和last\u name。

    因此,我建议对中的所有行进行注释 向上的 方法并将文件重新部署到服务器=>运行迁移并启动服务器。

    def up
      #add_column :users, :first_name, :string
      #add_column :users, :last_name, :string
    
      #User.all.each do |user|
       # fn, ln = name.split(' ', 2)
       #user.update(first_name: fn, last_name: ln)
      #end
    
      #remove_column :users, :name
     end
    
    推荐文章