SQL在迁移期间将数据从一个表复制到另一个表

时间:2016-04-08 08:51:28

标签: sql ruby-on-rails activerecord migration

我尝试在迁移过程中将数据从一个表移动到另一个表,同时添加新列。我的用户模型有列电话和phone_permission,我想移动到图库模型(包括其数据)。我的代码:

def self.up
  add_column :galleries, :phone, :string
  add_column :galleries, :phone_permission, :integer, default: 1

  execute "UPDATE galleries AS g, users AS u SET g.phone = u.phone WHERE u.id = g.user_id"
  execute "UPDATE galleries AS g, users AS u SET g.phone_permission = u.phone_permission WHERE u.id = g.user_id"

  remove_column :users, :phone
  remove_column :users, :phone_permission
end 

错误:SQLite3 :: SQLException:near" AS":语法错误:UPDATE画廊AS g,用户AS u SET g.phone = u.phone WHERE u.id = g.user_id

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

上面的代码对于SQLite来说不是有效的SQL。

另外,为什么不使用ActiveRecord呢?这样的事情可以解决问题:

Gallery.joins(:user).update_all('galleries.phone = users.phone')
Gallery.joins(:user).update_all('galleries.phone_permission = users.phone_permission')

编辑:update_all的{​​{3}}状态

  

此方法构造单个SQL UPDATE语句并将其直接发送到数据库。它不会实例化所涉及的模型,也不会触发Active Record回调或验证。

在我看来,这只是编写Raw SQL的一种更漂亮的方式。

编辑2:正如@llya在评论中指出的那样,如果您要更改模型名称,您的迁移将会中断。这里的一个简单技巧是在迁移之上添加此类定义:

class Gallery < ActiveRecord::Base; end