2010-08-23 29 views
8

Mantengo un proyecto Django con una base de datos que tiene varias restricciones de modelo que no se han sincronizado con la base de datos real. Entonces, por ejemplo, algunos campos de modelo tienen null = False set, pero la base de datos permite valores NULL para la columna de la base de datos correspondiente.Django - Comparar el código del modelo en la base de datos

Tengo curiosidad si hay una utilidad, ya sea en Django o en un script Python de terceros, que comparará la salida SHOW CREATE TABLE (en este caso, usando la sintaxis MySQL) para cada tabla y la comparará con python manage.py sql output, para resaltar las discrepancias.

De acuerdo, en una situación ideal, la base de datos no se desincronizaría con el código del modelo Django en primer lugar, pero como estoy allí, tengo curiosidad por saber si hay una solución a este problema antes de que escriba uno yo mismo o haga la comparación manualmente.

+0

¿por qué no las comparas con una herramienta diff, como esta http://www.quickdiff.com/index.php? –

+0

@ Gabi- eso es lo que hago a mano. Tenía curiosidad si alguien hubiera creado una utilidad que generara la salida para cada uno que yo pudiera fácilmente diferir. Como está ahora, funciona bien, pero la salida de cada uno no se alinea, así que tengo que hacerlo tabla por tabla. –

Respuesta

4

./manage.py inspectdb genera el archivo de modelo correspondiente a los modelos que existen dentro de la base de datos.

Puede diferenciarlo con los archivos de modelo actuales utilizando un diff de unix estándar o cualquier otro diseño de lujo diffing tool para encontrar la diferencia y planificar su estrategia de migración.

Mientras que la primera parece más simple y mejor, también puede ver la diferencia en el nivel sql. ./manage.py sqlall genera el sql para el esquema db actual y, en consecuencia, show create table table-name muestra el sql para la creación de la tabla.

Es posible que desee consultar http://code.google.com/p/django-evolution/ que una vez migró automáticamente el estado de la base de datos a la de los modelos actuales. - Tenga en cuenta, sin embargo, que este proyecto es antiguo y parece abandonado.

+0

Gracias, Lakshman. La utilidad diff funciona muy bien; de hecho, eso es lo que estoy usando. Estaba buscando una utilidad que se ejecute en todos los modelos en settings.INSTALLED_APPS y muestre el sql para cada uno, y luego el SHOW CREATE TABLE sql en el DB, produciendo dos salidas que son similares en estructura y que podrían diferirse fácilmente. Sé que podría no ser posible automatizar por completo, pero tenía curiosidad por saber si alguien había resuelto el problema. –

+0

Jim, por eso te mencioné para ver django-evolution. –

+0

Lakshman, eché un vistazo a django-evolution. Parece muy útil para el mantenimiento de la base de datos; gracias por compartir. –

3

Me vino con un medio rápido y sucio de hacer lo que describí. No es perfecto, pero si ejecuta ./manage.py testserver, la base de datos de prueba se creará en función del código del modelo. Entonces (utilizando la sintaxis específica de MySQL), se puede volcar el esquema de la base de datos regular y la base de datos de prueba para los archivos:

$ mysqldump -uroot -p [database_name] --no-data=true > schema.txt 
$ mysqldump -uroot -p [test_database_name] --no-data=true > test_schema.txt 

A continuación, puede simplemente Schema.txt diff y test_schema.txt y encontrar las diferencias.

+0

¡Rápido y sucio, y bajo nivel! Me gusta el hecho de que la diferencia está en el esquema DB, simple y llanamente. Gracias. – Fafaman

2

Para PostgreSQL, haga un manage.py syncdb en una base de datos temporal vacía, luego vacíe la producción y las bases de datos temporales con pg_dump -sOx y compare los archivos resultantes. Entre las herramientas de diferencia visual, al menos GNOME Meld parece funcionar bien con los volcados de PostgreSQL.

Cuestiones relacionadas