|
| 1 | +# weird issue with heroku + postgres referential integrity |
| 2 | +# http://pvcarrera.github.io/general/2016/02/15/rails-fixtures-and-referencial-integrity.html |
| 3 | + |
| 4 | +namespace :db do |
| 5 | + desc 'Reset and populate sample data' |
| 6 | + task load_swapi_fixtures: [:reset, :drop_constraints, 'fixtures:load', :create_constraints] do |
| 7 | + puts 'Fixtures loaded in the database' |
| 8 | + end |
| 9 | + |
| 10 | + desc 'Remove all database constraints' |
| 11 | + task drop_constraints: [:environment, :create_constraints_script, :drop_constraints_script] do |
| 12 | + ActiveRecord::Base.connection.execute(IO.read('tmp/drop_constraints.sql')) |
| 13 | + puts 'Constraints dropped' |
| 14 | + end |
| 15 | + |
| 16 | + desc 'Recreate database constraints' |
| 17 | + task create_constraints: [:environment, :create_constraints_script, :drop_constraints_script] do |
| 18 | + ActiveRecord::Base.connection.execute(IO.read('tmp/create_constraints.sql')) |
| 19 | + puts 'Constraints recreated' |
| 20 | + end |
| 21 | + |
| 22 | + file drop_constraints_script: :environment do |
| 23 | + query = (<<-SQL) |
| 24 | + SELECT 'ALTER TABLE "'||nspname||'"."'||relname||'" DROP CONSTRAINT "'||conname||'";' |
| 25 | + FROM pg_constraint |
| 26 | + INNER JOIN pg_class ON conrelid=pg_class.oid |
| 27 | + INNER JOIN pg_namespace ON pg_namespace.oid=pg_class.relnamespace |
| 28 | + ORDER BY CASE WHEN contype='f' THEN 0 ELSE 1 END,contype,nspname,relname,conname |
| 29 | + SQL |
| 30 | + array_to_file(ActiveRecord::Base.connection.execute(query), 'drop_constraints.sql') |
| 31 | + end |
| 32 | + |
| 33 | + file create_constraints_script: :environment do |
| 34 | + query = (<<-SQL) |
| 35 | + SELECT 'ALTER TABLE "'||nspname||'"."'||relname||'" ADD CONSTRAINT "'||conname||'" '|| pg_get_constraintdef(pg_constraint.oid)||';' |
| 36 | + FROM pg_constraint |
| 37 | + INNER JOIN pg_class ON conrelid=pg_class.oid |
| 38 | + INNER JOIN pg_namespace ON pg_namespace.oid=pg_class.relnamespace |
| 39 | + ORDER BY CASE WHEN contype='f' THEN 0 ELSE 1 END DESC,contype DESC,nspname DESC,relname DESC,conname DESC |
| 40 | + SQL |
| 41 | + array_to_file(ActiveRecord::Base.connection.execute(query), 'create_constraints.sql') |
| 42 | + end |
| 43 | + |
| 44 | + def array_to_file(array, file_name) |
| 45 | + Dir.mkdir('tmp') unless File.exist?('tmp') |
| 46 | + File.open("tmp/#{file_name}", 'w+') do |f| |
| 47 | + f.puts(array.values.flatten) |
| 48 | + end |
| 49 | + end |
| 50 | +end |
0 commit comments