2012-08-16 19 views
7

Al usar django-south, ¿es posible configurar una tabla solo para la última configuración más reciente sin aplicar todas las migraciones anteriores?No se pueden instalar las tablas de base de datos django-activity-stream

Estamos interesados ​​en utilizar una herramienta de terceros (django-activity-stream) pero estamos teniendo dificultades para ejecutar todas las migraciones, por razones algo desconocidas (posiblemente problemas de MySQL con respecto a un campo particular), específicamente migración 003, que genera una no se requiere de error

_mysql_exceptions.OperationalError: (1170, "BLOB/TEXT column 'object_id' used in key specification without a key length") " I strongly suspect that avoiding the migrations and going straight to the current schema will avoid this.

la capacidad de migrar hacia atrás, sólo la necesidad de hacernos el esquema actual en este momento, y no quiero que cortar el paquete para hacer frente a esto. Parece que no puedo establecer los comandos, ¿o si esto es posible?

config:

sur 0.7.6, 1.3.x Django, 5.5.x MySQL, django-actividad-stream 0.4.4

+0

Estoy viendo el mismo error en django 1.4 cuando ejecuto una migración –

+1

siento muchísimo si estoy equivocado porque no hay tiempo para probar, pero ¿por qué no puedes simplemente administrar manage.py syncdb --all y luego administrarlo. py migrate --fake? –

+0

nota: tendrá que eliminar manualmente las tablas de la aplicación de su base de datos si se crearon en algún estado incorrecto durante los esfuerzos anteriores, antes del funcionamiento anterior. –

Respuesta

4

Este error viene por la forma en que actstream maneja sus claves externas genéricas. El problema surge con MySql porque ve campos de texto sin ninguna longitud especificada .

Este error puede solucionarse al hacer que la migración 0003 no sea operativa.

Cambiar las siguientes cosas en migraciones 0003_text_field_ids, 0004_char_field_ids en el actstream:

0003_text_field_ids.py:

  1. eliminar todo en def forwards(self, orm), def backwards(self, orm) y acaba de escribir pass en ambos.
  2. Cambie TextField a PositiveIntegerField.

0004_char_field_ids.py:

  1. En def backwards(self, orm), cambie TextField-PositiveIntegerField en toda db.altercolumns().

Esto hace que la migración 0003 un NOOP usando el paso para adelante y hacia atrás y hace uso de la definición del modelo de PositiveIntegerFields para las teclas Genérico extranjeros, por lo que están guardados en el mismo estado que la migración 0001 les dejó. Al hacer esto, la migración 0004 puede recoger desde PositiveIntegerFields hasta varChars. A continuación, la corrección cambia la migración 0004 por lo que la migración hacia atrás cambia a PositiveIntegerFields en lugar de a TextFields.

Esto debería solucionar su problema.

2

no creo que el problema es causado por las migraciones, incluso se syncdb darte el mismo resultado

El error viene porque MySQL puede indexar solo los primeros N caracteres de una columna BLOB o TEXT. Por lo tanto, debe tener un tipo de campo/columna de TEXTO o BLOB que intente hacer como clave principal o índice.

Con BLOB completo o TEXTO sin el valor de longitud, MySQL no podrá garantizar la exclusividad de la columna ya que es de tamaño variable y dinámico. Por lo tanto, cuando se utilizan los tipos BLOB o TEXT como índice, se debe proporcionar el valor de N para que MySQL pueda determinar la longitud de la clave.

Trate de solucionar este problema y luego intente aplicar la migración, debería funcionar bien. y Sí, puede aplicar las migraciones y omitir las anteriores, pero le recomendaré que no haga esto, ya que así no se debe usar el sur.

Espero haber dejado las cosas un poco claras.

Cuestiones relacionadas