2009-10-21 10 views
11

¿Puedo configurar los raíles para usar mysql con MEMORY como motor de DB? Nunca reinicio mysql, y reconstruyo el DB tan a menudo que prefiero que sea rápido. Tener la memoria DB para ejecutar pruebas sería bueno también.Raíles con en la base de datos de memoria

EDITAR: Debería haber especificado que esto es solo para desarrollo/prueba, no para producción.

Respuesta

6

No veo por qué no pudiste; su elección de motor de almacenamiento es un detalle de implementación de MySQL. Todo lo que debe hacer es establecer :options => "ENGINE=MEMORY" en su declaración create_table en sus migraciones.

Por supuesto, tampoco entiendo por qué sería - especialmente en producción. La documentación de MySQL para el motor MEMORY es full of caveats, como la asignación de campo de longitud fija, y la ganancia de velocidad que se da cuenta debe ser trivial en comparación con el riesgo de perder todo. Si su aplicación es tal que no es necesario que persista nada, ¿por qué no se saltea por completo ActiveRecord y pone sus modelos encima de Memcached?

+0

Debería haber dicho originalmente, pero esto NO es para producción, solo para mí. Poner el motor en la migración no es una opción (a menos que lo haga de manera condicional según el entorno) –

+0

Así que hágalo condicionalmente según el entorno. ¿Por qué no es eso una opción? ': options => (RAILS_ENV! = 'production'?" ENGINE = MEMORY ": nil)' (Solo asegúrate de que tu prueba no sea eliminada por alguna rareza que solo existe en el motor de memoria.Personalmente, todavía no me molestaría con esto; pero si realmente crees que la velocidad de la base de datos es tu cuello de botella de prueba, no te gusta). – SFEley

+1

Porque no quiero comprometer las migraciones a la SCM con toda esa basura ahí. Quería hacerlo localmente, en mi pequeño mundo, y si hacía las cosas un poco más rápido para mí cuando tenía que hacer reconstrucciones de DB o algo así, entonces ganaba, pero si no, a quién le importaba, simplemente usaría el configuración regular. De las respuestas y algunas otras lecturas, es más trabajo de lo que vale (potencialmente ni siquiera). –

2

Uso sqlite3 en la base de datos de memoria para probar. Por lo general, es un poco más rápido que la base de archivos, pero no tanto, a menos que tenga una tonelada de datos de prueba.

Para poner esto en marcha su database.yml se verá así:

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

Usted también tiene que cargar su esquema en su base de datos en memoria en su ayudante prueba de este modo:

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

¿Por qué tendrías que establecer la conexión en la prueba? Pensé que esto es algo que Rails haría por ti. –

+0

He hecho esto también y es dulce, pero dejé de usar SQLite localmente debido a las diferencias entre él y MySQL/PostgreSQL. ActiveRecord oculta la mayoría de los detalles, pero hay suficiente diferencia para hacerlo molesto. –

+0

La conexión debe establecerse antes de que se ejecuten las pruebas para que el esquema pueda cargarse en la base de datos de memoria antes de que se carguen los rieles. El único lugar que conozco para cargarlo está en el auxiliar de prueba, y en este momento no hay conexión a la base de datos por raíles. Por favor corrígeme si estoy equivocado, o si hay una manera más fácil de hacerlo. –

1

Para fines de prueba considere https://github.com/mvz/memory_test_fix plug-in. Su uso es tan fácil como para actualizar database.yml y ejecutar

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

Usted puede también intentar instalar la gema memory_test_fix, pero es de diferente rama Git y no soporta Rails 3.

La gema me ayudó a reducir la prueba el tiempo de ejecución de los casos de 25 segundos a 19. Por otro lado, introduce una sobrecarga de 2 segundos en la inicialización del esquema de la base de datos (y no tengo tanto de ellos). Entonces, en pequeños grupos de pruebas no vale la pena molestarse.

La solución de la respuesta de Jason Stewart es básicamente la misma. Y lo usé en lugar del complemento, porque era más fácil combinarlo con el complemento de Spork.

Cuestiones relacionadas