Nic*_*nto 52 sql migration postgresql ruby-on-rails-3 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;
Run Code Online (Sandbox Code Playgroud)
由于我不能使用heroku dataclips删除表,我不能使用dataclips.
所以我想我需要在迁移中执行此操作.
如何将此sql写为迁移?
Tom*_*ess 99
对于您的向上迁移:
execute "CREATE TABLE cars_users2 AS SELECT DISTINCT * FROM cars_users;"
drop_table :car_users
rename_table :car_users2, :car_users
Run Code Online (Sandbox Code Playgroud)
和下来:
raise ActiveRecord::IrreversibleMigration
Run Code Online (Sandbox Code Playgroud)
完全迁移:
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
Run Code Online (Sandbox Code Playgroud)
Con*_*Map 17
您可以尝试使用该execute方法.
这样的事情(它是未经测试的,某种想法)
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
Run Code Online (Sandbox Code Playgroud)
由于没有等效down方法,ActiveRecord::IrreversibleMigration因此在尝试向下迁移时应该引发.
如果你需要使用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
Run Code Online (Sandbox Code Playgroud)
来源:http : //edgeguides.rubyonrails.org/active_record_migrations.html#using-reversible
https://apidock.com/rails/ActiveRecord/Migration/reversible
我更喜欢这里文档:
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
Run Code Online (Sandbox Code Playgroud)
注意: 这仅适用于 PostgreSQL,如果您使用的是MySQL,则应为适配器设置CLIENT_MULTI_STATEMENTS。
| 归档时间: |
|
| 查看次数: |
39224 次 |
| 最近记录: |