2009-10-21 40 views
11

Tôi có thể đặt đường ray để sử dụng mysql với MEMORY làm công cụ DB không? Tôi không bao giờ khởi động lại mysql, và xây dựng lại db vì vậy thường tôi muốn có nó được nhanh chóng. Có db bộ nhớ để chạy thử nghiệm sẽ được tốt đẹp quá.Đường ray có trong cơ sở dữ liệu bộ nhớ

CHỈNH SỬA: Tôi phải xác định điều này chỉ dành cho nhà phát triển/thử nghiệm chứ không phải sản xuất.

Trả lời

6

Tôi không hiểu tại sao bạn không thể; lựa chọn của bạn về công cụ lưu trữ là một chi tiết triển khai MySQL. Tất cả những gì bạn cần làm là đặt :options => "ENGINE=MEMORY" trong tờ khai create_table trong di chuyển của bạn.

Tất nhiên, tôi cũng không thấy lý do tại sao bạn sẽ - đặc biệt là trong sản xuất. Tài liệu MySQL cho động cơ MEMORY là full of caveats, như phân bổ trường độ dài cố định và tốc độ tăng tốc mà bạn nhận ra đã trở nên tầm thường so với nguy cơ mất mọi thứ. Nếu ứng dụng của bạn là như vậy mà không có gì cần phải được duy trì, bao giờ, tại sao không chỉ bỏ qua ActiveRecord hoàn toàn và lớp mô hình của bạn trên đầu trang của Memcached?

+0

Tôi nên nói ban đầu, nhưng điều này là KHÔNG cho sản xuất, chỉ cần tôi phát triển. Đặt động cơ trong quá trình di chuyển không phải là một lựa chọn sau đó (trừ khi tôi có điều kiện làm điều đó dựa trên môi trường) –

+0

Vì vậy, nó có điều kiện dựa trên môi trường. Tại sao đó không phải là một lựa chọn? ': options => (RAILS_ENV! = 'production'?" ENGINE = MEMORY ": nil)' (Chỉ cần chắc chắn rằng thử nghiệm của bạn không bị ném đi bởi một số sự kỳ quặc chỉ tồn tại trong bộ nhớ.Cá nhân, tôi vẫn không bận tâm với điều này; nhưng nếu bạn thực sự nghĩ rằng tốc độ cơ sở dữ liệu là nút cổ chai kiểm tra của bạn, hãy đánh gục mình.) – SFEley

+1

Bởi vì tôi không muốn cam kết di chuyển đến scm với tất cả những điều crap trong đó. Tôi chỉ muốn làm điều đó một cách cục bộ, trong thế giới nhỏ bé của riêng tôi, và nếu nó làm mọi việc nhanh hơn một chút cho tôi khi tôi phải làm lại db hoặc thứ gì đó, thì hãy thắng, nhưng nếu không, ai quan tâm, tôi chỉ sử dụng thiết lập thường xuyên. Từ các câu trả lời và một số đọc khác, nó hoạt động nhiều hơn giá trị của nó (thậm chí không có khả năng). –

2

Tôi sử dụng sqlite3 trong cơ sở dữ liệu bộ nhớ để thử nghiệm. Nó thường nhanh hơn một chút so với tập tin dựa trên, nhưng không phải là nhiều, trừ khi bạn có một tấn dữ liệu thử nghiệm.

Để thiết lập khả năng database.yml của bạn sẽ trông như thế này:

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

Bạn cũng sẽ phải tải schema của bạn vào cơ sở dữ liệu của bạn trong bộ nhớ trong helper thử nghiệm của bạn như sau:

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") 
+0

Tại sao bạn cần thiết lập kết nối trong thử nghiệm? Tôi nghĩ đây là điều Rails sẽ làm cho bạn. –

+0

Tôi đã làm điều này quá và nó là ngọt ngào, nhưng tôi ngừng sử dụng SQLite tại địa phương do sự khác biệt giữa nó và MySQL/PostgreSQL. ActiveRecord ẩn hầu hết các chi tiết nhưng có đủ sự khác biệt để làm cho nó khó chịu. –

+0

Kết nối phải được thiết lập trước khi thử nghiệm được chạy để lược đồ có thể được nạp vào cơ sở dữ liệu bộ nhớ trước khi tải đường ray. Nơi duy nhất mà tôi biết để tải nó là trong trình trợ giúp kiểm tra, và tại thời điểm này không có kết nối được thực hiện cho cơ sở dữ liệu bằng đường ray. Xin vui lòng sửa tôi nếu tôi sai, hoặc nếu có một cách dễ dàng hơn để làm điều đó. –

1

Vì mục đích thử nghiệm, hãy xem xét https://github.com/mvz/memory_test_fix trình cắm. Đó là việc sử dụng dễ dàng như việc cập nhật database.yml và chạy

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

Bạn có thể thử cũng cài đặt memory_test_fix đá quý, nhưng nó từ git branch khác nhau và không hỗ trợ Rails 3.

Các đá quý đã giúp tôi giảm kiểm tra trường hợp thực hiện thời gian từ 25 giây đến 19. Mặt khác, nó giới thiệu 2 chi phí thứ hai trên initialisation lược đồ cơ sở dữ liệu (và tôi không có nhiều trong số họ). Vì vậy, trên một loạt các bài kiểm tra nó không đáng làm phiền.

Giải pháp từ câu trả lời của Jason Stewart về cơ bản giống nhau. Và tôi đã sử dụng nó thay vì plugin, vì nó dễ dàng hơn để kết hợp nó với trình cắm thêm Spork.

Các vấn đề liên quan