[RUBY-ON-RAILS] 다른 표준 "생산"이 아닌 데이터베이스 또는 "개발"에 레일 마이그레이션을 사용하여
RUBY-ON-RAILS다른 표준 "생산"이 아닌 데이터베이스 또는 "개발"에 레일 마이그레이션을 사용하여
설정 / database.yml을에서 테스트 DB-연결 : 개발 : 나는 레일이 정의하는 표준 생산 :, 실행 프로젝트가
전혀 다른 호스트 / DB / 사용자 / 암호에 대한 정의를 가리키는 : 및 quiz_production : 또한 나는 quiz_development이
내 목표는 이제 마이그레이션을 정의하는 것입니다 사용 "퀴즈 _ # {RAILS_ENV} ''데이터베이스 구성 등.
내가 시도 (실패) 한 :
질문:
어떻게 갈퀴 DB를 만들 수 있습니다 마이그레이션 사용하는 다른 데이터베이스 정의가 있습니까?
감사, 솔직한
해결법
-
==============================
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.훨씬 쉽게 답이있다. 마이그레이션이 추가 :
훨씬 쉽게 답이있다. 마이그레이션이 추가 :
def connection ActiveRecord::Base.establish_connection("quiz_#{Rails.env}").connection end
즉 레일 3.1입니다. 레일 2.x 또는 3.0이 클래스의 기능을 대신입니다 (예 : DEF self.connection)
-
==============================
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.당신은 다른 데이터베이스 / 환경 / 설정 / 환경을 정의해야합니다.
당신은 다른 데이터베이스 / 환경 / 설정 / 환경을 정의해야합니다.
그 후 당신은 특정 환경을 마이그레이션하려면 다음 명령을 사용할 수 있습니다.
rake db:migrate RAILS_ENV=customenvironment
-
==============================
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.이봐, 난 며칠 동안이 파고되고 난 그냥 누군가를 도움이 될 수도, 그것을 공유하고 싶어,이 솔루션을 함께했다.
이봐, 난 며칠 동안이 파고되고 난 그냥 누군가를 도움이 될 수도, 그것을 공유하고 싶어,이 솔루션을 함께했다.
그것의 전체 요점 여기. 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.당신이 그들에 대한 스키마를 마이그레이션 할 다른 데이터베이스로 일련의 모델을 연결하는 추상 클래스를 사용하고 싶은 경우 @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.레일 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.
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.작동하지 않는 마이그레이션 연결 방법을 추가 레일 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.다른 환경에서 마이그레이션을 실행하는 것 외에도, 또한 별도의 파일의 스키마를 원한다. 명령 줄에서이 작업을 수행 할 수 있습니다
다른 환경에서 마이그레이션을 실행하는 것 외에도, 또한 별도의 파일의 스키마를 원한다. 명령 줄에서이 작업을 수행 할 수 있습니다
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.나는이 작업을 수행 할 수있는 좋은 깨끗한 방법을 발견했습니다 :
나는이 작업을 수행 할 수있는 좋은 깨끗한 방법을 발견했습니다 :
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.
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.롤백 : 당신은 또한 레이크 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.당신이 RAILS_ENV로 quiz_development를 사용하여 시도 가지고 (대신에 그것을 사용하려고 노력 "퀴즈 _ # {RAILS_ENV}")?
당신이 RAILS_ENV로 quiz_development를 사용하여 시도 가지고 (대신에 그것을 사용하려고 노력 "퀴즈 _ # {RAILS_ENV}")?
RAILS_ENV=quiz_development rake db:migrate
-
==============================
16.또한 그 하위 디렉토리에있는 마이그레이션을위한 레이크 일반 마이그레이션 기능을 미러링 작업을하지만 외모를 추가 한 후 DB / 디렉토리에 별도의 하위 폴더에 모든 quiz_ 관련 마이그레이션을 이동할 수 있습니다. 슈퍼 우아한하지 아마도하지만 작동합니다. 당신은 복사 레일에 이미 레이크 작업을 붙여 단지 그들에게 조금 수정할 수 있습니다.
또한 그 하위 디렉토리에있는 마이그레이션을위한 레이크 일반 마이그레이션 기능을 미러링 작업을하지만 외모를 추가 한 후 DB / 디렉토리에 별도의 하위 폴더에 모든 quiz_ 관련 마이그레이션을 이동할 수 있습니다. 슈퍼 우아한하지 아마도하지만 작동합니다. 당신은 복사 레일에 이미 레이크 작업을 붙여 단지 그들에게 조금 수정할 수 있습니다.
-
==============================
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.당신이 당신의 레일 웹 사이트에 워드 프레스 포스트를 표시 할 경우 당신은 멀티 포트 - 마법 연결 보석을 사용하지 않습니다. 당신은 워드 프레스 블로그에서 데이터를 얻기 위해 코드 아래를 사용할 수 있습니다.
당신이 당신의 레일 웹 사이트에 워드 프레스 포스트를 표시 할 경우 당신은 멀티 포트 - 마법 연결 보석을 사용하지 않습니다. 당신은 워드 프레스 블로그에서 데이터를 얻기 위해 코드 아래를 사용할 수 있습니다.
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.나는 다른 데이터베이스에 대해 별도의 커넥터 클래스를 작성하고 마이그레이션에서 그들을 사용하여이 작업을 얻었다.
나는 다른 데이터베이스에 대해 별도의 커넥터 클래스를 작성하고 마이그레이션에서 그들을 사용하여이 작업을 얻었다.
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
액티브 :: 자료는 클래스에 의해 색인 해시하는 연결 풀을 유지합니다. 자세한 내용은 여기를 참조하세요. 별도의 연결을위한 별도의 클래스를 사용 그래서 닫힌 연결 오류에서 우리를 보호합니다.
또한, 아래로 대신 변화의 최대 사용하는 것은 어떤 문제없이 마이그레이션을 롤백 할 수있게 해준다. 아직 그 이유를 파악하지 않았습니다.
from https://stackoverflow.com/questions/1404620/using-rails-migration-on-different-database-than-standard-production-or-devel by cc-by-sa and MIT license
'RUBY-ON-RAILS' 카테고리의 다른 글
[RUBY-ON-RAILS] 레일 : 하나의 폼에 버튼을 멀티 제출 (0) | 2020.02.18 |
---|---|
[RUBY-ON-RAILS] (4) 레일 - 부분적으로 가변 전달 (0) | 2020.02.18 |
[RUBY-ON-RAILS] 어떻게 레일 외부 루비 스크립트에서 액티브를 사용 하는가? (0) | 2020.02.18 |
[RUBY-ON-RAILS] 마이그레이션은 열 조합에 고유 제한 조건을 추가하는 (0) | 2020.02.18 |
[RUBY-ON-RAILS] 루비 온 레일스와 함께 사용하기 위해 창에 포스트 그레스 설치 (0) | 2020.02.18 |