Подтвердить что ты не робот

Несколько баз данных в Rails

Можно ли это сделать? В одном приложении, которое управляет многими проектами с помощью SQLite. Я хочу, чтобы у меня была другая база данных для каждого проекта, которым управляет мое приложение.. так много копий одноименно структурированной базы данных, но с разными данными в них. Я буду выбирать, какую копию использовать базу на params в URI.

Это сделано для 1. безопасности. Я новичок в этом программировании, и я не хочу, чтобы это произошло, потому что по какой-то причине во время работы над проектом другой получает повреждение.. 2. простая резервная копия и архив старых проектов

4b9b3361

Ответ 1

Рельсы по умолчанию не предназначены для архитектуры с несколькими базами данных, и в большинстве случаев это не имеет никакого смысла. Но да, вы можете использовать разные базы данных и подключения.

Вот некоторые ссылки:

Ответ 2

Если вы можете контролировать и настраивать каждый экземпляр Rails, и вы можете позволить себе тратить ресурсы из-за того, что они находятся в режиме ожидания, сохраните некоторые проблемы и просто измените database.yml, чтобы изменить соединение с базой данных, используемое для каждого экземпляра. Если вас беспокоит производительность, этот подход не сократит его.

Для моделей, привязанных к одной уникальной таблице только на одной базе данных, вы можете вызвать connection_connection внутри модели:

establish_connection "database_name_#{RAILS_ENV}"

Как описано здесь: http://apidock.com/rails/ActiveRecord/Base/establish_connection/class

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

Если у вас одинаковые таблицы, общие для разных баз данных и разделяемые одной моделью, ActiveRecord вам не поможет. Еще в 2009 году мне это потребовалось в проекте, над которым я работал, используя Rails 2.3.8. У меня была база данных для каждого клиента, и я назвал базы данных с их идентификаторами. Поэтому я создал метод для изменения соединения внутри ApplicationController:

def change_database database_id = params[:company_id]
    return if database_id.blank?

    configuration = ActiveRecord::Base.connection.instance_eval { @config }.clone
    configuration[:database] = "database_name_#{database_id}_#{RAILS_ENV}"

    MultipleDatabaseModel.establish_connection configuration
end

И добавил этот метод как before_filter ко всем контроллерам:

before_filter :change_database

Итак, для каждого действия каждого контроллера, когда params [: company_id] определяется и задается, он изменит базу данных на правильную.

Чтобы обрабатывать миграции, я расширил ActiveRecord:: Migration с помощью метода, который ищет всех клиентов и выполняет итерацию блока с каждым ID:

class ActiveRecord::Migration
    def self.using_databases *args
        configuration = ActiveRecord::Base.connection.instance_eval { @config }
        former_database = configuration[:database]

        companies = args.blank? ? Company.all : Company.find(args)

        companies.each do |company|
            configuration[:database] = "database_name_#{company[:id]}_#{RAILS_ENV}"
            ActiveRecord::Base.establish_connection configuration

            yield self
        end

        configuration[:database] = former_database
        ActiveRecord::Base.establish_connection configuration
    end
end

Обратите внимание, что, делая это, было бы невозможно сделать запросы в рамках одного действия из двух разных баз данных. Вы можете снова вызвать change_database, но это будет неприятно при попытке использовать методы, которые выполняют запросы, от объектов, которые больше не связаны с правильной базой данных. Кроме того, очевидно, что вы не сможете присоединиться к таблицам, которые принадлежат к различным базам данных.

Чтобы справиться с этим, ActiveRecord должен быть значительно расширен. К настоящему моменту должен быть плагин, который поможет вам в решении этой проблемы. Быстрое исследование дало мне следующее:

DB-Charmer: http://kovyrin.github.com/db-charmer/

Я готов попробовать. Сообщите мне, что сработает для вас.

Ответ 3

Я прошел мимо этого, добавив это в начало моих моделей, используя другую базу данных

class Customer < ActiveRecord::Base
  ENV["RAILS_ENV"] == "development" ? host = 'devhost' : host = 'prodhost'

  self.establish_connection(
      :adapter  => "mysql",
      :host     => "localhost",
      :username => "myuser",
      :password => "mypass",
      :database => "somedatabase"
    )

Ответ 4

Вы также должны проверить этот проект под названием DB Charmer: http://kovyrin.net/2009/11/03/db-charmer-activerecord-connection-magic-plugin/

DbCharmer - простой, но мощный плагин для ActiveRecord, который делает несколько вещей:

  • Позволяет легко управлять соединениями моделей AR (switch_connection_to)
  • Позволяет переключать стандартные подключения AR-моделей к отдельным серверам/базам данных
  • Позволяет вам легко выбирать, куда должен идти ваш запрос (on_* family)
  • Позволяет автоматически отправлять запросы чтения своим подчиненным устройствам, в то время как мастера обрабатывают все обновления.
  • Добавляет несколько миграций баз данных в ActiveRecord

Ответ 5

Стоит отметить, что во всех этих решениях вам нужно помнить о закрытии пользовательских подключений к базе данных. В противном случае вы столкнетесь с соединениями и увидите проблемы с таймаутом запроса.

Простое решение - clear_active_connections! в файле after_filter вашего контроллера.

after_filter :close_custom_db_connection

def close_custom_db_connection
  MyModelWithACustomDBConnection.clear_active_connections!
end

Ответ 6

в вашем config/database.yml сделать что-то вроде этого

default: &default
  adapter: postgresql
  encoding: unicode
  pool: 5

development:
  <<: *default
  database: mysite_development

test:
  <<: *default
  database: mysite_test

production:
  <<: *default
  host: 10.0.1.55
  database: mysite_production
  username: postgres_user
  password: <%= ENV['DATABASE_PASSWORD'] %>

db2_development:
  <<: *default
  database: db2_development

db2_test:
  <<: *default
  database: db2_test

db2_production:
  <<: *default
  host: 10.0.1.55
  database: db2_production
  username: postgres_user
  password: <%= ENV['DATABASE_PASSWORD'] %>

то в ваших моделях вы можете ссылаться на db2 с помощью

class Customers < ActiveRecord::Base
  establish_connection "db2_#{Rails.env}".to_sym
end

Ответ 7

В этом вопросе вы описали многопользовательскую (идентично структурированные базы данных с разными данными в каждой). Жемчужина квартиры отлично подходит для этого.

Для общего вопроса о нескольких базах данных в Rails: ActiveRecord поддерживает несколько баз данных, но Rails не предоставляет способ управлять ими. Я недавно создал Multiverse gem для решения этой проблемы.

Ответ 8

Лучшее решение, которое я нашел на данный момент, таково: есть 3 архитектуры баз данных, к которым мы можем обратиться. - Единая база данных для одного арендатора - Отдельная схема для каждого арендатора - Общая схема для арендаторов

Примечание: у них есть определенные плюсы и минусы, зависит от вашего варианта использования.

Я получил это из этого блога ! Стоит очень полезно для меня.

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