Activerecord Migrations множественная база данных postgresql - PullRequest
0 голосов
/ 26 июня 2019

У меня есть несколько баз данных. Все миграции для основной базы данных human_development работают нормально. Вторая база данных называется животными, и миграции не удаются.

database.yml:

default: &default
  adapter: postgresql
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  timeout: 5000
  encoding: unicode
  user: blah

development:
  <<: *default
  database: human_development

animals:
  <<: *default
  database: animals

Миграции, которые терпят неудачу:

class SomeTable < ActiveRecord::Migration[5.2]
  def change
    ActiveRecord::Base.establish_connection("animals")

    create_table :some_table, id: :uuid do |t|
      t.string :type
      t.timestamps
    end

    ActiveRecord::Base.establish_connection(Rails.env)
  end
end

Я также пробовал следующее, не работал:

  1. def connection
      ActiveRecord::Base.establish_connection("animals").connect
      #ActiveRecord::Base.establish_connection("animals".to_sym).connect
    end
    
  2. установить соединение вне стороны изменения

  ActiveRecord::Base.establish_connection("animals").connect
  # also tried with to_sym

Если я запускаю «rails db: migrate», передавая имя базы данных в виде строки, я получаю следующую ошибку:

rake aborted!
ActiveRecord::AdapterNotSpecified: database configuration does not specify adapter
.../db/migrate/2019_some_tables.rb:2:in

и если я запускаю rails db:migrate с to_sym, я получаю следующую ошибку:

-- create_table(:some_table, {:id=>:uuid})
rake aborted!
ActiveRecord::StatementInvalid: PG::ConnectionBad: connection is closed: SELECT pg_advisory_unlock


Caused by:
PG::ConnectionBad: connection is closed


Caused by:
StandardError: An error has occurred, this and all later migrations canceled:

PG::ConnectionBad: connection is closed: ROLLBACK


Caused by:
ActiveRecord::StatementInvalid: PG::ConnectionBad: connection is closed: ROLLBACK


Caused by:
PG::ConnectionBad: connection is closed

Ответы [ 2 ]

1 голос
/ 26 июня 2019

@ Eyeslandic Большое спасибо, это очень помогло!

На случай, если кто-то столкнется с такими же проблемами. Похоже, у rails 6 будет лучшее решение для этого, но, тем не менее, вот дополнительные изменения, которые я должен был сделать:

  1. database.yml: я хотел сохранить миграции в отдельной папке:
├── db
│   ├── migrate
│   ├── schema.rb
│   └── seeds.rb
├── animals_db
│   └── migrate
animals:
  <<: *default
  database: animals
  migrations_paths: animals_db/migrate
  1. Создать новую среду: config/environments/animals.rb
  2. Измените config/secrets.yml, чтобы включить новую среду
  3. Создать секрет: RAILS_ENV=animals rake secret
  4. Сохранить секрет в файле .env или экспортировать его
  5. Создать базу данных: rails db:create RAILS_ENV=animals
  6. Создайте миграцию в animals_db, но здесь есть подвох. Я должен был включить следующее в def change
def change
  create_table :some_table, id: :uuid do |t|
    enable_extension "uuid-ossp"
    enable_extension "pgcrypto"
    t.string :type
    t.timestamps
  end
end
  1. Запустить миграцию: rails db:migrate RAILS_ENV=animals

Возможно, вам придется изменить config/cable.yml, чтобы включить новую среду

Надеюсь, это поможет. Будем рады увидеть, как рельсы 6 улучшат это

1 голос
/ 26 июня 2019

Файл миграции должен быть одинаковым для всех баз данных

class SomeTable < ActiveRecord::Migration[5.2]
  def change    
    create_table :some_table, id: :uuid do |t|
      t.string :type
      t.timestamps
    end
  end
end

тогда в вашей консоли вы запускаете

# for the main db
rails db:migrate

# for the animals db
RAILS_ENV=animals rails db:migrate
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...