2010-06-05 15 views
9

Este es un pequeño general que conozco, pero me ha estado molestando muchísimo. He estado trabajando en muchos proyectos de raíles de forma remota con Git y cada vez que hago un git pull y veo que hay algún tipo de cambio de datos (migración o cambio de schema.rb) hago un rake db:migrate.¿Por qué cambia schema.rb (a los ojos de Git) cuando ejecuta rake db: migrate?

Generalmente funcionan bien y puedo seguir trabajando. Pero si hace un git pull y luego git status, su directorio de trabajo está limpio (obviamente) luego haga un rake db:migrate (obviamente cuando haya cambios) y otro git status y de repente su db/schema.rb ha cambiado. He estado haciendo un git checkout inmediatamente para restablecer a la última versión confirmada del archivo schema.rb, pero ¿por qué debería ser necesario? ¿Qué están haciendo los rieles? ¿Actualizando una marca de tiempo? Parece que no puedo entender cuál es la diferencia, pero ¿tal vez me estoy perdiendo algo?

+1

¿Cuál es la diferencia cuando ejecuta 'git diff db/schema.rb'? –

+0

Gracias por todos los comentarios chicos! Tiene más sentido ahora ... es una molestia menor pero siempre está buscando formas de hacer la vida más fácil. – erskingardner

Respuesta

10

El esquema permite a las máquinas ejecutar rake db:schema:load cuando se configuran por primera vez en lugar de tener que ejecutar las migraciones, que pueden estar desactualizadas si se renombran o eliminan los modelos, etc. Se supone que se debe actualizar después de una migración, y usted siempre desea la última versión registrada en el control de la fuente.

+0

pero ¿es bueno simplemente confirmar los cambios que ve en el archivo de esquema? – locoboy

+0

¿De qué otra manera lo mantendría actualizado? – x1a4

2

schema.rb refleja el esquema de su base de datos por lo que cuando migra (con cambios) sigue que su esquema también cambia para reflejar su cambio de db. Normalmente agrego schema.rb a nuestro gitignore, junto con database.yml (probablemente porque en lugar de usar schema: carga como el de abajo, suelo hacer un dump de sql al clonar una aplicación existente, pero así soy yo)

-1

El final de db:migrate es volcar el esquema. Tendrá diferentes marcas de tiempo (debería decírselo), y diferentes versiones de rieles/gemas de base de datos le darán formatos ligeramente diferentes. Es una molestia menor ver esto todo el tiempo.

Le recomiendo que agregue schema.rb a su archivo .gitignore.

+2

En Rails 2+, 'schema.rb' tiene el siguiente comentario:' Se recomienda encarecidamente que compruebe este archivo en su sistema de control de versiones. Yo recomendaría ** no ** agregar 'schema.rb' a '.gitignore' –

+0

Enmendaré/actualizaré/retiraré mi respuesta: Sí, ahora se recomienda que la controle, y esa es probablemente una buena idea para la mayoría de los proyectos. Puede haber alguna lógica que no actualice de forma arbitraria la marca de tiempo si no cambió nada más, parece que no cambia demasiado debajo de usted, por lo que ese es probablemente el caso. Habrá situaciones en las que no desee verificar el esquema, pero en estos días, por lo general, es mejor verificarlo. – ndp

5

El orden de los atributos en el volcado refleja el orden de los atributos en la base de datos, y puede desalinearse si una persona ha estado jugando localmente con migraciones, ejecutándolas hacia adelante y hacia atrás manualmente, y editando cosas a obtenerlos solo así. Es posible crear un estado donde el orden de los atributos en schema.rb del empujador sea diferente de lo que todos los demás verán cuando ejecuten las migraciones.

Si es fácil recrear sus datos de desarrollo, simplemente reconstruya la base de datos desde schema.rb, luego todos están sincronizados (pero recuerde que no puede volver a cargar los datos de un volcado de SQL que también crea la tabla). recrear el problema. Tiene que ser un volcado/carga de solo datos). En el peor de los casos, puede crear una migración para eliminar la columna y otra para volver a agregarla.

Cuestiones relacionadas