2011-09-20 29 views
5

Sto integrando un database MySQL da una app php in un nuovo progetto Django. Inspectdb ha funzionato bene, ho solo dovuto cambiare un paio di campi in ForeignKeys e ora tutti i dati correnti di lettura e modifica funzionano alla grande.Django - db legacy e problemi con il campo 'id'

Il problema è quando si tenta di creare una nuova voce, ottengo l'errore "Field 'id' doesn't have a default value". Il traceback inizia dalla chiamata form.save() e l'eccezione viene dal cursore MySQL. Nella maggior parte dei casi la colonna è chiamato id ma in un caso si tratta di un valore denominato:

class ModelOne(models.Model): #normal "id" named pk 
    id = models.AutoField(primary_key=True, db_column='id', default=None) 
    other_fields = ... 

class ModelTwo(models.Model): #specific pk 
    named_pk = models.AutoField(primary_key=True, db_column='named_pk', 
           default=None) 
    other_fields = ... 

Per ModelTwo, quando posto una forma valida, ottengo l'errore, ma poi se torno alla mia lista dei dati , il nuovo oggetto compare! E dopo aver controllato gli ultimi valori id nella shell, posso vedere che stanno aumentando correttamente.

Ma per ModelOne (con solo id), l'errore si presenta ancora e il pk diventa 2147483647 (il massimo) e i successivi salvataggi falliscono a causa di ID duplicati. (il pk più alto successivo è solo 62158)

Cosa devo fare per far funzionare correttamente questi campi ID?


aggiornamento: Ancora nessuna fortuna risolvere questo. Pensando a scaricare i dati e importarli in nuovi tavoli creati da Django. Sto ancora cercando una soluzione a questo problema.


Update2: Info dal guscio db

ModelOne:

+-------------+--------------+-------+------+---------+-----------------+ 
| Field  | Type   | Null | Key | Default | Extra   | 
| id   | int(11)  | NO | PRI | NULL | auto_increment | 

ModelTwo:

+-------------+--------------+-------+------+---------+-----------------+ 
| Field  | Type   | Null | Key | Default | Extra   | 
| named_pk | int(11)  | NO | PRI | NULL | auto_increment | 
+0

Che cosa succede se si rimuove il 'default = Nessuno '? –

+0

@Daniel Roseman - stessa cosa esatta. L'ho aggiunto solo nel tentativo di indirizzare direttamente quello che sembrava l'errore stava puntando su –

risposta

1

ho finito per l'esportazione dei dati dal database originale, e il caricamento in un db fresca che è stato generato dai miei modelli/progetti.

Penso di aver provato troppe cose con la copia del database originale su cui stavo lavorando e ho creato un errore nell'SQL sottostante per il campo pk.

Sono contento di aver lavorato solo con una copia.

+0

La stessa cosa è successa a me, stessa correzione. L'esportazione dei dati, quindi la ricreazione delle tabelle ha permesso a django di impostare l'attributo di auto-incremento mysql delegando correttamente la generazione del nuovo pk a mysql. – hobs

3

Ha senso per definire pk per ModelTwo (come stanno già facendo) perché il tuo pk ha un nome diverso 'named_pk'. Tuttavia, non è necessario definire esplicitamente "id" come pk per ModelOne. Django creerà la colonna id per impostazione predefinita. Quindi non definire la colonna id per ModelOne.

UPDATE: remove "default = None" dal modello e di default NULL dal database per ModelTwo per named_pk

+0

Ho provato anche questo approccio. Se vado nell'SQL e guardo la struttura in grado, c'è già una colonna 'id' impostata su auto_increment. Penso che il problema risieda nel fatto che Django lo riconosca. Qualche idea sul perché l'errore si stia verificando per ModelTwo nonostante abbia effettivamente salvato i dati correttamente? –

+0

Ho aggiornato la mia domanda per mostrare l'output di MySQL da 'SHOW COLUMNS FROM table_name'. Non seguo esattamente quello che stai dicendo, ModelTwo non ha una colonna chiamata 'id'. Il campo 'named_pk' è sempre stato la colonna PK. Per quel modello, il valore effettivo di 'named_pk' è molto importante (si correla ai numeri di ordine sequenziali in un sistema di acquisto). –

+0

Se non c'è alcuna colonna 'id' nella tabella ModelTwo, allora qual è l'errore quando si salva ModelTwo? –

5

Ho incontrato lo stesso problema dopo una complessa migrazione meridionale. Volevamo evitare di ricaricare il database (dump/import), per fortuna aiuterà le altre persone che rientrano in questo post dopo aver cercato lo stesso problema.

Abbiamo trovato una soluzione che risolve questo problema senza la necessità di esportare e importare il database.

Per una tabella denominata auth_user, il seguente comando MySQL sarà fixe il messaggio di errore di cui sopra:

ALTER TABLE auth_user MODIFY `id` INT(11) NOT NULL AUTO_INCREMENT; 

soluzione originale da:

http://webit.ca/2012/01/field-id-doesnt-have-a-default-value/

+0

+1 Questo ha funzionato per me. –