PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

nilai terlalu panjang untuk jenis karakter yang bervariasi (100) ---- database yang baru saja diganti, tidak melakukan apa pun dalam db

Saya tidak berpikir Anda memerlukan bantuan untuk memperbaiki masalah ini, sama seperti Anda membutuhkan bantuan untuk men-debug-nya. Setelah masalahnya jelas, solusinya juga tampak jelas. Traceback mungkin agak tidak jelas karena melewati begitu banyak kode sumber Django dan tidak memberitahu Anda bidang mana yang mengalami masalah.

Latar Belakang Masalah Ini

Untuk memulainya, kami mengalami masalah saat menyimpan Post contoh. Nah, lihat semua bidang ini yang Anda miliki dalam definisi model Anda:

 ...
  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)

Ini mungkin tidak terlihat seperti bidang teks, tetapi banyak di antaranya adalah variasi pada bidang teks karena, jika Anda memikirkannya, Anda mungkin tidak akan menyimpan seluruh file dalam basis data Anda. Apa yang akan anda lakukan sebagai gantinya (dan apa yang Django lakukan secara default) adalah menyimpan file di suatu tempat pada beberapa disk dan kemudian dalam database anda akan menyimpan path ke file itu sehingga Anda dapat mengambilnya kembali saat Anda membutuhkannya.

Selanjutnya, mungkin sia-sia untuk menyimpan jalur file di db sebagai LongText atau apa pun, jadi setiap FileField kami memiliki berarti kami memiliki bidang dengan max_length apakah kita menentukannya atau tidak. Jadi, semua bidang di atas memiliki max_length implicit implisit . Anda sebenarnya dapat menemukan ini dengan membaca kode sumber Django.

Contoh Sumber

Saya tidak pernah menggunakan EmbedVideoField , misalnya, tetapi ternyata subkelas dari models.URLField , yang berarti memiliki max_length secara default setel ke 200 jika Anda tidak menentukannya.

Selain itu, berbagai ImageField . Anda s hanyalah subkelas dari FileField , yang memiliki max_length default 100 .

Bagaimana Cara Men-debug Masalah Seperti Ini Di Masa Depan?

Sekarang, ini tidak membantu kita untuk mengetahui yang mana bidang Anda membuat kesalahan dalam kasus ini. Untuk itu, saya mungkin akan menetapkan breakpoint di suatu tempat dalam kode, mungkin di sini:

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

Dengan "menetapkan breakpoint", maksud saya sebagai berikut:

Pergi ke baris 65 dalam modul yang disebutkan di atas, ebagu/main/models.py dan masukkan berikut ini dan simpan modul:import pdb; pdb.set_trace()

(Saya sebenarnya memiliki preferensi yang kuat untuk ipdb sendiri, tetapi itu membutuhkan Ipython, yang juga saya sukai ...)

Jalankan server lokal Anda, dan jalankan melalui langkah-langkah yang menghasilkan masalah ini. Anda akhirnya akan mengirimkan formulir Anda dan jika Anda melihat konsol tempat Anda memulai server Anda, Anda akhirnya akan dibuang ke shell tepat di baris 65. Shell ini adalah kulit pdb , yang memiliki aturan berbeda dari shell biasa, tetapi Anda dapat mengevaluasi Post yang akan disimpan misalnya, dengan melihat berbagai bidang pada instance itu sendiri, self , dan menjalankan kode Python dalam konteks pemanggilan metode tersebut:

(pdb) len(self.image.path)

Dengan menggunakan itu, saya akan secara manual mengevaluasi berbagai bidang dan melihat mana yang memiliki entri yang sangat panjang ini yang mencekik penyimpanan (mungkin salah satu dari ImageField Anda s).

Solusi dengan Peringatan

Sebagai alternatif, Anda bisa menambahkan max_length untuk semua ini, tetapi diperingatkan bahwa kemungkinan besar Anda perlu melakukan migrasi basis data untuk setiap bidang teks terbatas yang Anda ubah karena database Anda masih akan memverifikasi panjang input terhadap bagaimana kolom didefinisikan. Inilah jawaban StackOverflow yang bagus untuk melihat masalah ini .

Catatan kaki

Mengapa ini tidak muncul sebelum Anda beralih ke Postgresql? Ada berbagai alasan potensial, tetapi mungkin ada hubungannya dengan bagaimana basis data sebelumnya disetel vs bagaimana basis data Postgresql disetel (secara manual vs migrasi Django?).

Mungkin juga ada hubungannya dengan apakah Anda mengubah tempat penyimpanan barang-barang ini atau tidak. Apakah Anda mengubah MEDIA pengaturan sehingga jalur tempat file disimpan menjadi lebih lama?

Apa yang Anda benar-benar harus lakukan adalah melihat langsung ke database Anda. Buka psql contoh dan minta untuk menggambarkan tabel Anda untuk Anda. Ini akan memberi tahu Anda bidang mana yang dibatasi hingga 100 karakter dan itu adalah bidang yang memberi Anda masalah.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PostgreSQL memeriksa apakah array berisi elemen apa pun dari array sebelah kiri

  2. Kolom 'mary' tidak ada

  3. Menghitung partisi tabel di tabel Postgres

  4. Konfigurasikan STS dengan JPA 2.0 menggunakan PostgreSQL 9.3

  5. PostgreSQL, tidak dapat memperbarui baris (dengan keamanan tingkat baris)