2010-04-13 44 views
5

Cómo hago que syncdb ejecute consultas SQL (para la creación de tablas) definidas por mí, en lugar de generar tablas automáticamente.En Django, cómo crear tablas desde un archivo SQL cuando se ejecuta syncdb

Estoy buscando esta solución, ya que algunos modelos particulares en mi aplicación representan vistas de tabla SQL para una tabla de base de datos heredada. Por lo tanto, he creado sus vistas SQL en mi django-DB de esta manera:

CREAR VIEW legacy_series AS SELECT * FROM legacy.series;

Tengo un modelo de ingeniería inversa que representa la vista anterior/legacytable. Pero siempre que ejecuto syncdb, primero tengo que crear todas las vistas ejecutando scripts sql; de lo contrario, syncdb simplemente crea tablas para ellas (si no se encuentra una vista).

¿Cómo hago que syncdb ejecute el SQL mencionado anteriormente?

Respuesta

5

Hay 2 enfoques posibles que conozco para adaptar sus modelos a una tabla de base de datos existente (sin utilizar puntos de vista que es):

1) Ejecutar python manage.py inspectdb dentro de su proyecto. Esto generará modelos para tablas de bases de datos existentes, luego puede continuar trabajando con ellas.

2) Modifique sus tablas con algunas configuraciones específicas. Antes que nada, defina el nombre de la tabla en su modelo estableciendo la opción db_table en sus meta opciones. En segundo lugar, defina para cada campo el nombre de la columna para que coincida con su base de datos heredada configurando la opción db_column. Tenga en cuenta que hay otras opciones de db_ en la lista que posiblemente podría utilizar para que coincida con su base de datos heredada.

Si realmente desea el enfoque de vistas, es posible una solución (fea), puede definir custom sql commands por modelo de aplicación. Este archivo se encuentra en "application"/sql/"model" .sql. Django llamará a este sql después de que creó todas las tablas. Puede intentar especificar instrucciones DROP para las tablas generadas, seguidas por su declaración de creación de vista en este archivo. Tenga en cuenta que esto será un poco complicado para las tablas con claves foráneas, ya que django no garantiza el orden de ejecución de estos archivos (así que rellenar todas las declaraciones en un .sql será la manera más fácil, creo que nunca lo he intentado antes).

4

Puede usar unmanaged models para sus modelos de ingeniería inversa, y initial SQL scripts para crear sus vistas.

EDITAR:

respuesta

Un poco más detallada. Cuando utiliza modelos no administrados, syncdb no creará las tablas de la base de datos para usted, por lo que debe encargarse usted mismo. Un punto importante es el nombre de la tabla, y cómo django asigna las clases Model a los nombres de tabla, sugiero que lea the doc on that point.

Básicamente, su modelo Series se parecerá a lo siguiente:

class Series(models.Model): 
    # model fields... 
    ... 

    class Meta: 
     managed = False 
     db_table = "legacy_series" 

Entonces, usted puede poner sus comandos SQL, en el archivo yourapp/sql/series.sql:

### yourapp/sql/series.sql 
CREATE VIEW legacy_series AS SELECT * FROM legacy.series; 

A continuación, puede syncdb como de costumbre, y comience a usar sus modelos heredados.

Cuestiones relacionadas