복붙노트

[RUBY-ON-RAILS] 다른 표준 "생산"이 아닌 데이터베이스 또는 "개발"에 레일 마이그레이션을 사용하여

RUBY-ON-RAILS

다른 표준 "생산"이 아닌 데이터베이스 또는 "개발"에 레일 마이그레이션을 사용하여

설정 / database.yml을에서 테스트 DB-연결 : 개발 : 나는 레일이 정의하는 표준 생산 :, 실행 프로젝트가

전혀 다른 호스트 / DB / 사용자 / 암호에 대한 정의를 가리키는 : 및 quiz_production : 또한 나는 quiz_development이

내 목표는 이제 마이그레이션을 정의하는 것입니다 사용 "퀴즈 _ # {RAILS_ENV} ''데이터베이스 구성 등.

내가 시도 (실패) 한 :

질문:

어떻게 갈퀴 DB를 만들 수 있습니다 마이그레이션 사용하는 다른 데이터베이스 정의가 있습니까?

감사, 솔직한

해결법

  1. ==============================

    1.A는 늦게 비트,하지만 난 오늘이 문제를 처리하고 있었고, 난이 사용자 정의 레이크 작업을 함께했다 :

    A는 늦게 비트,하지만 난 오늘이 문제를 처리하고 있었고, 난이 사용자 정의 레이크 작업을 함께했다 :

    namespace :db do
      desc "Apply db tasks in custom databases, for example  rake db:alter[db:migrate,test-es] applies db:migrate on the database defined as test-es in databases.yml"
      task :alter, [:task,:database] => [:environment] do |t, args|
        require 'activerecord'
        puts "Applying #{args.task} on #{args.database}"
        ActiveRecord::Base.establish_connection(ActiveRecord::Base.configurations[args.database])
        Rake::Task[args.task].invoke
      end
    end
    
  2. ==============================

    2.훨씬 쉽게 답이있다. 마이그레이션이 추가 :

    훨씬 쉽게 답이있다. 마이그레이션이 추가 :

    def connection
      ActiveRecord::Base.establish_connection("quiz_#{Rails.env}").connection
    end
    

    즉 레일 3.1입니다. 레일 2.x 또는 3.0이 클래스의 기능을 대신입니다 (예 : DEF self.connection)

  3. ==============================

    3.나는 다음과 같은 코드로 작업이 있어요.

    나는 다음과 같은 코드로 작업이 있어요.

    class AddInProgressToRefHighLevelStatuses < ActiveRecord::Migration
      def connection
        @connection = ActiveRecord::Base.establish_connection("sdmstore_#{Rails.env}").connection
      end
    
      def change
        add_column :ref_high_level_statuses, :is_in_progress, :boolean, :default => true
    
        @connection = ActiveRecord::Base.establish_connection("#{Rails.env}").connection
      end
    end
    

    그것은 레이크가 시도하지 것이다 그래서이 schema_migrations 테이블로 마이그레이션을 작성 얻기 위해 연결 다시 설정하는 것이 필요하다고 마이그레이션에게 다음 번에 다시 실행합니다. 이렇게하면 해당 프로젝트에 대한 버전 제어에 체크 마이그레이션을 추적하는 기본 데이터베이스 구성에서 schema_migrations 테이블을 원하는 것으로 가정합니다.

    나는 일에 아래로 마이그레이션을 얻을 수 없습니다.

  4. ==============================

    4.당신은 다른 데이터베이스 / 환경 / 설정 / 환경을 정의해야합니다.

    당신은 다른 데이터베이스 / 환경 / 설정 / 환경을 정의해야합니다.

    그 후 당신은 특정 환경을 마이그레이션하려면 다음 명령을 사용할 수 있습니다.

    rake db:migrate RAILS_ENV=customenvironment
    
  5. ==============================

    5.나는 최근에 같은 문제로 고생. 목표는 이미 너무 크고 여전히 매우 빠르게 성장하고 이후 다른 데이터베이스에 역사 테이블을 분할하는 것이 었습니다.

    나는 최근에 같은 문제로 고생. 목표는 이미 너무 크고 여전히 매우 빠르게 성장하고 이후 다른 데이터베이스에 역사 테이블을 분할하는 것이 었습니다.

    (: history_database) 나는 액티브 :: Base.establish_connection을 수행하여이를 해결하려고 시작했지만, 연결이 종료되지 않고 작업에 그런 식의 변화를 가져올 수 없습니다. 그리고 마지막으로 나는 아래의 해결책을 발견했다.

    변경을 한 후에 역사 모델에서 :

    class History < ActiveRecord::Base
    
      # Directs queries to a database specifically for History
      establish_connection :history_database
    
      ...
    end
    

    나는 이전에이 작업을 수행 할 수 있었다 그것은 완벽하게 작동 :

    class CreateHistoriesTableInHistoryDatabase < ActiveRecord::Migration
      def up
        History.connection.create_table :histories do |t|
          ...
        end
      end
    
      def down
        History.connection.drop_table :histories
      end
    end
    

    이것은 다른 데이터베이스에서 테이블을 만들고, 아직 이전이 다시 실행되지 않도록 원본 데이터베이스에 schema_migrations 테이블을 수정합니다.

  6. ==============================

    6.이봐, 난 며칠 동안이 파고되고 난 그냥 누군가를 도움이 될 수도, 그것을 공유하고 싶어,이 솔루션을 함께했다.

    이봐, 난 며칠 동안이 파고되고 난 그냥 누군가를 도움이 될 수도, 그것을 공유하고 싶어,이 솔루션을 함께했다.

    그것의 전체 요점 여기. https://gist.github.com/rafaelchiti/5575309 그것은 세부 사항 ANS 설명이 있습니다. 당신이 그들을 필요하지만 자세한 내용을 검색 할 수 있습니다.

    접근 방식은 DB를 이미 알려진 레이크 작업에 네임 스페이스를 추가 기반으로합니다 마이그레이션, DB : 드롭을하고 다른 데이터베이스와 그 작업을 수행, DB를 만들 수 있습니다. 그리고 database.yml을 새로운 파일의 구성에 기초하여 접속하는 기지국 활동 레코드 (AR) 클래스를 추가한다. 당신이 이런 식으로 연결 재료로 마이그레이션을 주위에 해킹 할 필요가 없습니다 당신은 깨끗한 디렉토리 구조를 얻는다.

    귀하의 구조는 다음과 같이 종료됩니다

    config
      |- database.yml
      \- another_database.yml (using the same nomenclature of 'development', 'test', etc).
    
    db
      |- migrate (default migrate directory)
      |- schema.rb
      |- seed.rb
    
    another_db
      |- migrate (migrations for the second db)
      |- schema.rb (schema that will be auto generated for this db)
      |- seed.rb (seed file for the new db)
    

    그런 다음 코드에서 당신이 기본 클래스를 생성하고이 새로운 database.yml을 파일에서 설정을 읽을 만 모델에 연결할 수 AR 기본 클래스에서 상속. (요지 예).

    베스트!.

  7. ==============================

    7.당신이 그들에 대한 스키마를 마이그레이션 할 다른 데이터베이스로 일련의 모델을 연결하는 추상 클래스를 사용하고 싶은 경우 @Bryan 라슨에 이어, 당신은이 작업을 수행 할 수 있습니다

    당신이 그들에 대한 스키마를 마이그레이션 할 다른 데이터베이스로 일련의 모델을 연결하는 추상 클래스를 사용하고 싶은 경우 @Bryan 라슨에 이어, 당신은이 작업을 수행 할 수 있습니다

    class CreatePosts < ActiveRecord::Migration
        def connection
          Post.connection
        end
        def up
          ...
        end
    end
    

    모델 뭔가를 같이 설정합니다 :

    class Post < ReferenceData
    end
    

    class ReferenceData < ActiveRecord::Base
      self.abstract_class = true
      establish_connection "reference_data_#{Rails.env}"
    end
    
  8. ==============================

    8.레일 3.2의 경우,이 우리가 무슨 짓을 위 아래로 마이그레이션와 함께 작동합니다 :

    레일 3.2의 경우,이 우리가 무슨 짓을 위 아래로 마이그레이션와 함께 작동합니다 :

    class CreateYourTable < ActiveRecord::Migration
    
      def connection
        @connection ||= ActiveRecord::Base.connection
      end
    
      def with_proper_connection
        @connection = YourTable.connection
        yield
        @connection = ActiveRecord::Base.connection
      end
    
    
      def up
        with_proper_connection do
          create_table :your_table do |t|
          end
        end
      end
    
      def down
        with_proper_connection do
          drop_table :your_table
        end
      end
    
    end
    
  9. ==============================

    9.

    module ActiveRecord::ConnectionSwitch
      def on_connection(options)
        raise ArgumentError, "Got nil object instead of db config options :(" if options.nil?
        ActiveRecord::Base.establish_connection(options)
        yield
      ensure
        ActiveRecord::Base.establish_connection ActiveRecord::Base.configurations[Rails.env]
      end
    end
    
    ActiveRecord.send :extend, ActiveRecord::ConnectionSwitch
    

    이 내부의 설정 / 초기화를 배치하면 / 당신이 뭔가를 할 수 있습니다 :

    ActiveRecord.on_connection ActiveRecord::Base.configurations['production'] do
      Widget.delete_all
    end
    

    이것은 생산 DB에 모든 위젯을 삭제하고 있는지 현재 레일 ENV의 DB에 연결이 그 후 다시 설정되어 있는지 확인합니다.

    당신은 단지 액티브 :: 마이그레이션 클래스를 확장 INSEAD 마이그레이션 작업에 사용할 수 있도록합니다.

  10. ==============================

    10.작동하지 않는 마이그레이션 연결 방법을 추가 레일 3.2에서. 같은 답변의 모든 그래서

    작동하지 않는 마이그레이션 연결 방법을 추가 레일 3.2에서. 같은 답변의 모든 그래서

    def connection
     @connection ||= ActiveRecord::Base.establish_connection
    end
    

    간단하지 않습니다 일 (수 없습니다 아래로 수, 않습니다 변화, 손실 연결 등을하지 작업) 그 이유는 액티브 :: 마이그레이션 및 Migrator를 클래스는 연결이 온통 액티브 :: 자료에 하드 코딩해야한다는 것입니다 장소.

    다행히이 게시물은 즉 실제 레이크 작업을 무시, 좋은 솔루션을이 티켓에 저를 지적했다.

    나는 내가 다른 데이터베이스에서 실행되는 마이그레이션에 대한 특정 (우리는 여러 DB 버전을 지원하기 위해 노력하고 있었다)이 될 수 있도록 약간 다른 레이크 작업을 사용하여 결국 :

    여기 내 lib 디렉토리 / 작업 / database.rake입니다

    # Augment the main migration to migrate your engine, too.
    task 'db:migrate', 'nine_four:db:migrate'
    
    namespace :nine_four do
        namespace :db do
            desc 'Migrates the 9.4 database'
            task :migrate => :environment do
                with_engine_connection do
                    ActiveRecord::Migrator.migrate("#{File.dirname(__FILE__)}/../../nine_four/migrate", ENV['VERSION'].try(:to_i))
                end
            end
        end
    end
    
    # Hack to temporarily connect AR::Base to your engine.
    def with_engine_connection
        original = ActiveRecord::Base.remove_connection
        ActiveRecord::Base.establish_connection("#{ Rails.env }_nine_four")
        yield
    ensure
        ActiveRecord::Base.establish_connection(original)
    end
    

    이것은 우리가 자신의 서브 디렉토리에 하나 개의 데이터베이스로 마이그레이션의 특정을 넣을 수 있습니다 (nine_four / 대신 dB / 마이그레이션 마이그레이션). 또한 자신의 스키마 및 이전 버전의 관점에서 각 데이터베이스의 총 격리를 제공합니다. (: 마이그레이션 및 nine_four : DB : 마이그레이션 DB를) 유일한 단점은 실행이 레이크 작업을 가지고있다.

  11. ==============================

    11.다른 환경에서 마이그레이션을 실행하는 것 외에도, 또한 별도의 파일의 스키마를 원한다. 명령 줄에서이 작업을 수행 할 수 있습니다

    다른 환경에서 마이그레이션을 실행하는 것 외에도, 또한 별도의 파일의 스키마를 원한다. 명령 줄에서이 작업을 수행 할 수 있습니다

    RAILS_ENV=quiz_development SCHEMA=db/schema_quiz_development.rb rake db:migrate
    

    나는이를 대신 입력 할 수 있도록하지만 사용자 정의 레이크 작업 방식을 좋아한다 :

    rake db:with[quiz_development, db:migrate]
    

    여기에 레이크 작업입니다 :

    namespace :db do
      desc "Run :task against :database"
      task :with, [:database,:task] => [:environment] do |t, args|
        puts "Applying #{args.task} to #{args.database}"
        ENV['SCHEMA'] ||= "#{Rails.root}/db/schema_#{args.database}.rb"
        begin
          oldRailsEnv = Rails.env
          Rails.env = args.database
          ActiveRecord::Base.establish_connection(args.database)
          Rake::Task[args.task].invoke
        ensure
          Rails.env = oldRailsEnv
        end
      end
    end
    
  12. ==============================

    12.나는이 작업을 수행 할 수있는 좋은 깨끗한 방법을 발견했습니다 :

    나는이 작업을 수행 할 수있는 좋은 깨끗한 방법을 발견했습니다 :

    class CreateScores < ActiveRecord::Migration
    
      class ScoresDB < ActiveRecord::Base
        establish_connection("scores_#{Rails.env}")
      end
    
      def connection
        ScoresDB.connection
      end
    
      def up
        create_table :scores do |t|
          t.text :account_id
          t.text :offer
        end
      end
    
      def down
        drop_table :scores
      end
    end
    
  13. ==============================

    13.

    class Article < ActiveRecord::Base
    
        ActiveRecord::Base.establish_connection(
          :adapter  => "mysql2",
          :host     => "localhost",
          :username => "root",
          :database => "test"
        )
    end
    

    과:

    class Artic < Aritcle
        self.table_name = 'test'
    
        def self.get_test_name()
            query = "select name from testing"
            tst = connection.select_all(query) #select_all is important!
            tst[0].fetch('name')
        end
    end
    

    당신은 실행하기 위해 Artic.get_test_name를 호출 할 수 있습니다.

  14. ==============================

    14.롤백 : 당신은 또한 레이크 DB를 지원하는이 버전을 사용할 수 있습니다 :

    롤백 : 당신은 또한 레이크 DB를 지원하는이 버전을 사용할 수 있습니다 :

    class ChangeQuiz < ActiveRecord::Migration
      def connection
        ActiveRecord::Base.establish_connection("quiz_#{Rails.env}").connection
      end
    
      def reset_connection
        ActiveRecord::Base.establish_connection(Rails.env)
      end
    
      def up
        # make changes
    
        reset_connection
      end
    
      def self.down
        # reverse changes
    
        reset_connection
      end
    end
    
  15. ==============================

    15.당신이 RAILS_ENV로 quiz_development를 사용하여 시도 가지고 (대신에 그것을 사용하려고 노력 "퀴즈 _ # {RAILS_ENV}")?

    당신이 RAILS_ENV로 quiz_development를 사용하여 시도 가지고 (대신에 그것을 사용하려고 노력 "퀴즈 _ # {RAILS_ENV}")?

    RAILS_ENV=quiz_development rake db:migrate
    
  16. ==============================

    16.또한 그 하위 디렉토리에있는 마이그레이션을위한 레이크 일반 마이그레이션 기능을 미러링 작업을하지만 외모를 추가 한 후 DB / 디렉토리에 별도의 하위 폴더에 모든 quiz_ 관련 마이그레이션을 이동할 수 있습니다. 슈퍼 우아한하지 아마도하지만 작동합니다. 당신은 복사 레일에 이미 레이크 작업을 붙여 단지 그들에게 조금 수정할 수 있습니다.

    또한 그 하위 디렉토리에있는 마이그레이션을위한 레이크 일반 마이그레이션 기능을 미러링 작업을하지만 외모를 추가 한 후 DB / 디렉토리에 별도의 하위 폴더에 모든 quiz_ 관련 마이그레이션을 이동할 수 있습니다. 슈퍼 우아한하지 아마도하지만 작동합니다. 당신은 복사 레일에 이미 레이크 작업을 붙여 단지 그들에게 조금 수정할 수 있습니다.

  17. ==============================

    17.TheDeadSerious의 대답 @ 기준 자료 :

    TheDeadSerious의 대답 @ 기준 자료 :

    module ActiveRecord::ConnectionSwitch  
      def on_connection(connection_spec_name)
        raise ArgumentError, "No connection specification name specified. It should be a valid spec from database.yml" unless connection_spec_name
        ActiveRecord::Base.establish_connection(connection_spec_name)
        yield
      ensure
        ActiveRecord::Base.establish_connection(Rails.env)
      end
    end
    
    ActiveRecord.send :extend, ActiveRecord::ConnectionSwitch
    

    용법:

    ActiveRecord.on_connection "sdmstore_#{Rails.env}" do
      Widget.delete_all
    end
    
  18. ==============================

    18.당신이 당신의 레일 웹 사이트에 워드 프레스 포스트를 표시 할 경우 당신은 멀티 포트 - 마법 연결 보석을 사용하지 않습니다. 당신은 워드 프레스 블로그에서 데이터를 얻기 위해 코드 아래를 사용할 수 있습니다.

    당신이 당신의 레일 웹 사이트에 워드 프레스 포스트를 표시 할 경우 당신은 멀티 포트 - 마법 연결 보석을 사용하지 않습니다. 당신은 워드 프레스 블로그에서 데이터를 얻기 위해 코드 아래를 사용할 수 있습니다.

     class Article < ActiveRecord::Base
    
        ActiveRecord::Base.establish_connection(
         :adapter  => "mysql2",
         :host     => "localhost",
         :username => "root",
         :database => "blog"
        )
    
        self.table_name = 'wp_posts'
    
        def self.get_post_data()
            query = "select name from testing"
            tst = connection.select_all(query)
            tst[0].fetch('name')
        end
    end
    
  19. ==============================

    19.나는 다른 데이터베이스에 대해 별도의 커넥터 클래스를 작성하고 마이그레이션에서 그들을 사용하여이 작업을 얻었다.

    나는 다른 데이터베이스에 대해 별도의 커넥터 클래스를 작성하고 마이그레이션에서 그들을 사용하여이 작업을 얻었다.

    class AddExampleToTest < ActiveRecord::Migration
      def connection
        @connection = OtherDatabaseConnector.establish_connection("sdmstore_#{Rails.env}").connection
      end
      def up
        add_column :test, :example, :boolean, :default => true
    
        @connection = MainDatabaseConnector.establish_connection("#{Rails.env}").connection
      end
      def down
        remove_column :test, :example
    
        @connection = MainDatabaseConnector.establish_connection("#{Rails.env}").connection
      end
    end
    

    우리는 초기화에이 커넥터 클래스를 정의 할 수 있습니다.

    class MainDatabaseConnector < ActiveRecord::Base
    end
    class OtherDatabaseConnector < ActiveRecord::Base
    end
    

    액티브 :: 자료는 클래스에 의해 색인 해시하는 연결 풀을 유지합니다. 자세한 내용은 여기를 참조하세요. 별도의 연결을위한 별도의 클래스를 사용 그래서 닫힌 연결 오류에서 우리를 보호합니다.

    또한, 아래로 대신 변화의 최대 사용하는 것은 어떤 문제없이 마이그레이션을 롤백 할 수있게 해준다. 아직 그 이유를 파악하지 않았습니다.

  20. from https://stackoverflow.com/questions/1404620/using-rails-migration-on-different-database-than-standard-production-or-devel by cc-by-sa and MIT license