2009-10-21 3 views
11

Kann ich Rails festlegen, um mysql mit MEMORY als DB-Engine zu verwenden? Ich starte mysql nie neu und baue die db so oft auf, dass ich es lieber schnell hätte. Die Speicher-DB zum Ausführen von Tests wäre auch nett.Rails mit in der Speicherdatenbank

EDIT: Ich hätte angegeben, das ist nur für Dev/Test, nicht Produktion.

Antwort

6

Ich sehe nicht, warum Sie nicht konnten; Die Auswahl der Speicher-Engine ist ein MySQL-Implementierungsdetail. Alles, was Sie tun müssen, ist :options => "ENGINE=MEMORY" in Ihrer create_table Deklaration in Ihren Migrationen.

Natürlich sehe ich auch nicht, warum Sie würde - vor allem in der Produktion. Die MySQL-Dokumentation für die MEMORY-Engine ist full of caveats, wie die Field-Allocation fester Länge, und der Geschwindigkeitsgewinn, den Sie realisieren würden, muss im Vergleich zu dem Risiko, alles zu verlieren, trivial sein. Wenn Ihre Anwendung so konzipiert ist, dass nichts dauerhaft sein muss, warum sollten Sie ActiveRecord nicht komplett überspringen und Ihre Modelle auf Memcached auflegen?

+0

Ich hätte ursprünglich sagen sollen, aber das ist NICHT für die Produktion, nur ich entwickle. Putting die Engine in die Migration ist dann keine Option (sofern ich es nicht bedingt auf der Grundlage der Umgebung tun) –

+0

So tun es bedingt auf der Grundlage der Umgebung. Warum ist das keine Option? ': options => (RAILS_ENV! = 'production'?" ENGINE = MEMORY ": nil)' (Stellen Sie nur sicher, dass Ihre Tests nicht durch etwas Seltsames, das nur in der Speicher-Engine existiert, verworfen werden.Persönlich würde ich mich immer noch nicht damit befassen; aber wenn du wirklich denkst, dass Datenbankgeschwindigkeit dein Test-Engpass ist, klopfe dich selbst aus.) – SFEley

+1

Weil ich die Migrationen zum scm nicht mit dem ganzen Mist in dort festlegen will. Ich wollte es einfach lokal machen, in meiner eigenen kleinen Welt, und wenn es die Dinge ein bisschen schneller für mich machen würde, wenn ich db rebuilds oder so machen müsste, dann gewinne, aber wenn nicht, wen interessiert das? regelmäßige Einrichtung Aus den Antworten und einigen anderen Lektüre, es ist mehr Arbeit als es (möglicherweise nicht einmal) wert ist. –

2

Ich benutze sqlite3 in der Speicherdatenbank zum Testen. Es ist normalerweise ein wenig schneller als Datei basiert, aber nicht so viel, es sei denn, Sie haben eine Tonne von Testdaten.

einzustellen, dass Ihre database.yml up wird wie folgt aussehen:

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:" 

Sie werden auch Ihr Schema in der In-Memory-Datenbank in Ihrem Test Helfer wie so laden müssen

+0

Warum sollten Sie die Verbindung im Test herstellen? Ich dachte, das wäre etwas, was Rails für dich tun würde. –

+0

Ich habe das auch getan und es ist süß, aber ich habe aufgehört, SQLite wegen der Unterschiede zwischen MySQL und PostgreSQL lokal zu verwenden. ActiveRecord verbirgt die meisten Details, aber es gibt genug Unterschiede, um es störend zu machen. –

+0

Die Verbindung muss vor dem Ausführen der Tests hergestellt werden, damit das Schema vor dem Laden der Rails in die Speicherdatenbank geladen werden kann. Der einzige Ort, den ich kenne, um es zu laden, ist in der Testhelfer, und zu diesem Zeitpunkt ist keine Verbindung mit der Datenbank durch Schienen hergestellt. Bitte korrigieren Sie mich, wenn ich falsch liege oder wenn es einen einfacheren Weg gibt. –

1

Für Testzwecke https://github.com/mvz/memory_test_fix Plug-in in Betracht ziehen. Es ist Nutzung so einfach wie database.yml zu aktualisieren und

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

Sie können auch versuchen installieren memory_test_fix Juwel laufen, aber es ist aus verschiedenen git Zweig und bietet keine Unterstützung für Rails 3.

Der Edelstein hat mir geholfen Test zu reduzieren Fälle Ausführungszeit von 25 Sekunden bis 19. Auf der anderen Seite, führt es 2 Sekunden Aufwand für Datenbankschema Initialisierung (und ich habe nicht so viel von ihnen). Bei kleinen Testreihen lohnt es sich also nicht zu stören.

Lösung von Jason Stewarts Antwort ist im Grunde das Gleiche. Und ich habe es anstelle des Plugins verwendet, weil es einfacher war, es mit dem Spork Plug-in zu kombinieren.

Verwandte Themen