PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

valore troppo lungo per il tipo carattere variabile(100)----database cambiato di recente, non ha fatto nulla in db

Non penso che tu abbia bisogno di aiuto per risolvere questo problema, tanto quanto hai bisogno di aiuto per eseguirne il debug. Una volta che il problema è chiaro, anche la soluzione sembra chiara. Il traceback è forse un po' poco chiaro perché sta attraversando così tanto codice sorgente Django e non ti dice quale dei tuoi campi sta riscontrando un problema.

Il background di questo problema

Per cominciare, stiamo riscontrando problemi nel salvare un Post esempio. Bene, guarda tutti questi campi che hai nella definizione del modello:

 ...
  url = models.URLField(max_length=250, blank=True, null=True)
  video = EmbedVideoField(verbose_name='link',help_text="Youtube", blank=True, null=True) 
  content = RichTextUploadingField(config_name='default')
  image = models.ImageField(upload_to='images',blank=True, null=True)
  thumbnail = models.ImageField(upload_to='images', blank=True, null=True)

Questi potrebbero non sembrare campi di testo, ma molti di essi sono variazioni sui campi di testo perché, se ci pensi, probabilmente non memorizzerai interi file nel tuo database. Quello che farai invece (e cosa fa Django per impostazione predefinita) è archiviare il file da qualche parte su un disco e quindi nel database memorizzerai il percorso a quel file in modo da poterlo recuperare quando necessario.

Inoltre, è probabilmente uno spreco memorizzare i percorsi dei file nel db come LongText o qualsiasi altra cosa, quindi ogni FileField abbiamo significa che abbiamo un campo con un max_length se lo specifichiamo o meno. Pertanto, tutti i campi precedenti hanno un max_length implicito . Puoi effettivamente scoprirlo leggendo il codice sorgente di Django.

Esempi di origine

Non ho mai usato EmbedVideoField , per esempio, ma risulta essere una sottoclasse di models.URLField , il che significa che ha un max_length per impostazione predefinita impostato su 200 se non ne specifichi uno.

Inoltre, i tuoi vari ImageField s sono solo sottoclassi di FileField , che ha un max_length predefinito di 100 .

Come eseguire il debug di problemi come questo in futuro?

Ora, questo non ci aiuta a sapere quale dei tuoi campi sta generando un errore in questo caso. Per questo, probabilmente imposterei un punto di interruzione da qualche parte nel codice, probabilmente qui:

File "ebagu/main/models.py" in save
   66.       super(Post, self).save(*args, **kwargs)

Per "imposta un punto di interruzione", intendo quanto segue:

Vai alla riga 65 nel modulo sopra menzionato, ebagu/main/models.py e inserisci quanto segue e salva il modulo:import pdb; pdb.set_trace()

(In realtà ho una forte preferenza per ipdb me stesso, ma ciò richiede Ipython, per il quale ho anche una forte preferenza per...)

Esegui il tuo server locale ed esegui i passaggi che hanno prodotto questo problema. Finirai per inviare il tuo modulo e se guardi la console in cui hai avviato il tuo server, alla fine verrai scaricato in una shell proprio alla riga 65. Questa shell è un shell pdb , che ha regole diverse da una normale shell, ma puoi valutare il tuo Post che sta per essere salvato esempio, osservando i vari campi dell'istanza stessa, self e eseguendo codice Python nel contesto di quella chiamata al metodo:

(pdb) len(self.image.path)

Usandolo, valuterei manualmente i vari campi e guarderei quale ha questa voce davvero lunga che sta soffocando il salvataggio (probabilmente uno dei tuoi ImageField s).

Soluzione con avvisi

In alternativa, puoi semplicemente aggiungere un max_length a tutti questi, ma tieni presente che molto probabilmente dovrai eseguire migrazioni del database per qualsiasi campo di testo limitato si modifica perché il database verificherà ancora la lunghezza dell'input rispetto a come viene definita la colonna. Ecco una buona risposta StackOverflow che esamina esattamente questo problema .

Nota a piè di pagina

Perché questo non è emerso prima di passare a Postgresql? Ci sono una serie di potenziali ragioni, ma probabilmente ha a che fare con il modo in cui è stato configurato il database precedente rispetto a come è stato impostato il database Postgresql (manualmente rispetto alle migrazioni Django?).

Potrebbe anche avere a che fare con la modifica o meno della posizione in cui vengono archiviate queste cose. Hai cambiato il tuo MEDIA impostazioni in modo che i percorsi in cui sono archiviati i file siano molto più lunghi?

Quello che dovresti davvero fare è guardare direttamente il tuo database. Apri un psql esempio e chiedigli di descrivere le tue tabelle per te. Ti dirà quali campi sono limitati a 100 caratteri e quelli sono i campi che ti danno problemi.