2010-02-05 6 views
16

Nuestro equipo está desarrollando una aplicación Rails en MySQL y usando config.active_record.schema_format = :sql por The Rails Guides.Fuera de sincronización Los valores AUTO_INCREMENT en development_structure.sql de Rails/MySQL crean ruido diff

Naturalmente, nuestros AUTO_INCREMENT valores en development_structure.sql salen de sincronización a medida que desarrollamos en paralelo. Sabemos que tener valores diferentes en nuestras bases de datos para AUTO_INCREMENT no es un problema técnico. Sin embargo, crea mucho ruido diff cuando diff antes del check-in. En más de una ocasión, hemos roto nuestra construcción porque uno de nosotros se perdió un cambio importante en development_structure.sql que estaba disimulado por todo el ruido.

¿Alguna sugerencia sobre cómo eliminar este ruido diff para que nuestros ojos puedan enfocarse en cambios importantes?

Gracias.

+0

¿Es esta una pregunta tonta? –

+0

¿Cómo se ve la diferencia real? Su herramienta diff puede necesitar actualización. –

+0

La diferencia estaba bien. Demostró que la base de datos MySQL de desarrollo de cada desarrollador tenía un valor AUTO_INCREMENT diferente para cada tabla, lo que naturalmente ocurre cuando los desarrolladores están creando registros en sus propias máquinas. –

Respuesta

7

Una variante de la respuesta aceptada es incluir lo siguiente en un archivo .rake en lib/tareas:

Rake::Task["db:structure:dump"].enhance do 
    path = Rails.root.join('db', 'structure.sql') 
    File.write path, File.read(path).gsub(/ AUTO_INCREMENT=\d*/, '') 
end 

Esto tiene la ventaja de hacer el cambio en el comportamiento parece más intencional (como lo sugiere: http://edgar.tumblr.com/post/52300664342/how-to-extend-an-existing-rake-task), esp. si se coloca en un archivo de nombre descriptivo (por ejemplo, 'skip_auto_increment.rake').

5

En Razoo, terminamos anulando db: migrate

task :migrate do 
    Rake::Task['db:migrate'].invoke 
    Rake::Task['db:structure:dump'].invoke 
end 

y luego db: Estructura: volcado

namespace :structure do 
    desc "Dump the database structure to a SQL file" 
    task :dump do 
     Rake::Task['db:structure:dump'].invoke 
     # open up the development_structure.sql file and gsub AUTO_INCREMENT=\d* with AUTO_INCREMENT 
    end 
    end 
end 
12

@Ian, muchas gracias por la pista. Pero en Rails 3.2 ahora es mucho más simple. No es necesario invocar tareas, ya que conduce a un nivel de error demasiado profundo y no es necesario anular la descripción de la tarea. Así que mi código es así:

namespace :db do 
    namespace :structure do 
    task :dump do 
     path = Rails.root.join('db', 'structure.sql') 
     File.write path, File.read(path).gsub(/ AUTO_INCREMENT=\d*/, '') 
    end 
    end 
end 

funciona tanto para db:migrate y db:structure:dump.

+0

Esto no funciona en Ruby 1.9.2 "método indefinido' write 'para Archivo: Clase " – Jan

+0

Este método está disponible en 1.9.3 – sekrett

+0

¿Dónde se pega este código en su proyecto de Rails? – abeger

Cuestiones relacionadas