Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Rails中的迁移中编写SQL_Sql_Postgresql_Ruby On Rails 3_Migration_Rails Activerecord - Fatal编程技术网

如何在Rails中的迁移中编写SQL

如何在Rails中的迁移中编写SQL,sql,postgresql,ruby-on-rails-3,migration,rails-activerecord,Sql,Postgresql,Ruby On Rails 3,Migration,Rails Activerecord,我需要执行以下SQL语句 CREATE TABLE cars_users2 AS SELECT DISTINCT * FROM cars_users; DROP TABLE cars_users; ALTER TABLE cars_users2 RENAME TO cars_users; 因为我不能使用heroku数据剪辑删除表,所以我不能使用数据剪辑 所以我想我需要在迁移中这样做 如何将此sql编写为迁移?您可以尝试使用该方法 像这样的东西是未经测试的,某种想法 class Update

我需要执行以下SQL语句

CREATE TABLE cars_users2 AS SELECT DISTINCT * FROM cars_users;

DROP TABLE cars_users;

ALTER TABLE cars_users2 RENAME TO cars_users;
因为我不能使用heroku数据剪辑删除表,所以我不能使用数据剪辑

所以我想我需要在迁移中这样做

如何将此sql编写为迁移?

您可以尝试使用该方法

像这样的东西是未经测试的,某种想法

class UpdateCarUserTable < ActiveRecord::Migration
  def up
    execute "CREATE TABLE cars_users2 AS SELECT DISTINCT * FROM cars_users"
    execute "DROP TABLE cars_users"
    execute "ALTER TABLE cars_users2 RENAME TO cars_users"
  end
由于没有等效的down方法,因此在尝试向下迁移时应引发ActiveRecord::ReversibleMigration。

对于向上迁移:

execute "CREATE TABLE cars_users2 AS SELECT DISTINCT * FROM cars_users;" 
drop_table :car_users  
rename_table :car_users2, :car_users  
class TheMigration < ActiveRecord::Migration
    def up
        execute "CREATE TABLE cars_users2 AS SELECT DISTINCT * from cars_users;" 
        drop_table :car_users  
        rename_table :car_users2, :car_users  
    end

    def down
        raise ActiveRecord::IrreversibleMigration
    end
end
至于down:

raise ActiveRecord::IrreversibleMigration
完全迁移:

execute "CREATE TABLE cars_users2 AS SELECT DISTINCT * FROM cars_users;" 
drop_table :car_users  
rename_table :car_users2, :car_users  
class TheMigration < ActiveRecord::Migration
    def up
        execute "CREATE TABLE cars_users2 AS SELECT DISTINCT * from cars_users;" 
        drop_table :car_users  
        rename_table :car_users2, :car_users  
    end

    def down
        raise ActiveRecord::IrreversibleMigration
    end
end
我更喜欢这里,博士:

execute <<-SQL
  CREATE TABLE cars_users2 AS SELECT DISTINCT * FROM cars_users;
  DROP TABLE cars_users;
  ALTER TABLE cars_users2 RENAME TO cars_users;
SQL
注意: 这只适用于PostgreSQL,如果您使用的是MySQL,您应该为适配器设置。

如果您需要使用change而不是up和down,您可以使用reversible。 它在Rails 4或更高版本上工作

class ExampleMigration < ActiveRecord::Migration
  def change
    create_table :distributors do |t|
      t.string :zipcode
    end

    reversible do |dir|
      dir.up do
        # add a CHECK constraint
        execute <<-SQL
          ALTER TABLE distributors
            ADD CONSTRAINT zipchk
              CHECK (char_length(zipcode) = 5) NO INHERIT;
        SQL
      end
      dir.down do
        execute <<-SQL
          ALTER TABLE distributors
            DROP CONSTRAINT zipchk
        SQL
      end
    end

    add_column :users, :home_page_url, :string
    rename_column :users, :email, :email_address
  end
end
资料来源:


为什么您更喜欢这样?设置CLIENT\u MULTI\u语句是一个严重的安全风险,涉及SQL注入。这就是它默认关闭的原因。