2009-10-21 4 views
11

DB 엔진으로 MEMORY와 함께 mysql을 사용하도록 레일을 설정할 수 있습니까? 절대로 mysql을 다시 시작하지 않고 자주 db를 다시 작성하기 때문에 빨리 수행해야합니다. 테스트를 실행하기위한 메모리 DB를 갖는 것도 좋습니다.메모리 데이터베이스가있는 레일

편집 : 내가 지정 했어야합니다. 이것은 개발/테스트 용이며 생산 용이 아닙니다.

답변

6

나는 왜 그렇게 할 수 없었는지 알지 못한다. 스토리지 엔진의 선택은 MySQL 구현 세부 사항입니다. 당신이해야 할 일은 귀하의 이주에서 create_table 선언에 :options => "ENGINE=MEMORY"을 설정하는 것입니다.

물론 이 될 이유는 알지 못합니다. 특히 제작 단계에서 그렇습니다. MEMORY 엔진에 대한 MySQL 문서는 고정 길이 필드 할당과 마찬가지로 full of caveats이며 모든 속도를 잃을 위험에 비해 속도를 높이는 것이 쉽습니다. 응용 프로그램에서 아무 것도 유지할 필요가 없다면 ActiveRecord를 완전히 건너 뛰고 Memcached 위에 모델을 겹쳐 놓는 것이 어떻습니까?

+0

나는 원래 말했어 야했는데, 이것은 생산을위한 것이 아니라, 내가 개발 한 것입니다. 마이그레이션에 엔진을 넣는 것은 옵션이 아닙니다. (조건부로 환경을 기준으로하지 않는 한) –

+0

환경에 따라 조건부로 수행합니다. 왜 그게 옵션이 아닌가? ': options => (RAILS_ENV! = 'production'? "ENGINE = MEMORY": nil)'(단지 테스트가 메모리 엔진에만 존재하는 어떤 이상한 점에 의해 버려지지 않도록하라.개인적으로, 나는 아직도 이것에 신경 쓰지 않을 것이다; 하지만 실제로 데이터베이스 속도가 테스트 병목 현상이라고 생각하면 자신을 노크 해보십시오.) – SFEley

+1

scm에 마이 그 레이션을 저지르고 싶지 않기 때문에. 나 자신의 작은 세계에서 그것을 로컬로하고 싶었고, db 재 빌드 나 뭔가를해야만했을 때 나를 위해 좀 더 빨리 만들었다면, 그렇다면 이기고, 그렇지 않다면, 누가 신경 써야 할까? 정기적 인 설정. 답변 및 기타 읽기에서 볼 때, 잠재적으로 가치가있는 것보다 많은 작업이 있습니다. –

2

테스트 용 메모리 데이터베이스에 sqlite3을 사용합니다. 대개 파일 기반보다 약간 빠르지 만 테스트 데이터가 많지 않으면 그 정도는 아닙니다.

는 다음과 같이됩니다 database.yml을을 그를 설정하려면 :

config = YAML::load(IO.read(File.dirname(__FILE__) + "/../config/database.yml")) 
ActiveRecord::Base.logger = Logger.new(File.dirname(__FILE__) + "/../log/debug.log") 
ActiveRecord::Base.establish_connection(config["test"]) 
load(File.dirname(__FILE__) + "/../db/schema.rb") 
:

test: 
adapter: sqlite3 
database: ":memory:" 

또한과 같이 테스트 도우미 메모리 데이터베이스에로 스키마를로드해야합니다

+0

왜 테스트에서 연결을 설정해야합니까? 레일스가 당신을 위해 할 일이라고 생각했습니다. –

+0

나는 이것 또한 해냈다. 그리고 그것은 달콤하다. 그러나 그것과 MySQL/PostgreSQL의 차이점 때문에 SQLite를 로컬로 사용하지 않았다. ActiveRecord는 대부분의 세부 정보를 숨기지 만 성가심을 줄만큼 충분한 차이가 있습니다. –

+0

레일을로드하기 전에 스키마를 메모리 데이터베이스에로드 할 수 있도록 테스트를 실행하기 전에 연결을 설정해야합니다. 내가로드 할 수있는 유일한 곳은 테스트 도우미에 있으며이 시점에서 레일을 통해 데이터베이스에 연결되지 않았습니다. 내가 틀렸거나 더 쉬운 방법이 있다면 저를 바로 잡으십시오. –

1

테스트 목적으로 https://github.com/mvz/memory_test_fix 플러그인을 고려하십시오. 그것은 database.yml를 업데이트하고

rails plugin install git://github.com/mvz/memory_test_fix.git 

당신은 또한 시도 memory_test_fix 보석을 설치할 수 있습니다 실행 한 쉽게 사용하지만 서로 다른 자식 지점에서의 및 보석 테스트를 줄이기 위해 저를 도와 3.

레일을 지원하지 않습니다 사례 실행 시간은 25 초에서 19 초입니다. 다른 한편, 데이터베이스 스키마 초기화에 2 초의 오버 헤드가 발생합니다 (그 중 많은 부분이 필요하지 않습니다). 따라서 작은 테스트 세트에서는 귀찮은 가치가 없습니다.

Jason Stewart의 답변은 기본적으로 같습니다. Spork 플러그인과 결합하기가 더 쉽기 때문에 플러그인 대신 사용했습니다.

관련 문제