PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

giá trị quá dài đối với ký tự loại thay đổi (100) ---- cơ sở dữ liệu được chuyển đổi gần đây, không thực hiện bất kỳ điều gì trong db

Tôi không nghĩ rằng bạn cần trợ giúp để khắc phục sự cố này, vì vậy bạn cần trợ giúp để gỡ lỗi nó. Một khi vấn đề rõ ràng, giải pháp cũng có vẻ rõ ràng. Traceback có lẽ hơi không rõ ràng vì nó sử dụng quá nhiều mã nguồn Django và nó không cho bạn biết trường nào của bạn đang gặp sự cố.

Cơ sở cho vấn đề này

Để bắt đầu, chúng tôi đang gặp sự cố khi lưu Post ví dụ. Vâng, hãy xem tất cả các trường này mà bạn có trong định nghĩa mô hình của mình:

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

Những thứ này có thể không giống các trường văn bản, nhưng rất nhiều trong số chúng là các biến thể trên các trường văn bản bởi vì nếu bạn nghĩ về nó, có thể bạn sẽ không lưu trữ toàn bộ tệp trong cơ sở dữ liệu của bạn. Thay vào đó, những gì bạn sẽ làm (và những gì Django làm theo mặc định) là lưu trữ tệp ở đâu đó trên đĩa nào đó và sau đó trong cơ sở dữ liệu, bạn sẽ lưu trữ đường dẫn vào tệp đó để bạn có thể truy xuất nó khi cần.

Hơn nữa, có thể lãng phí khi lưu trữ đường dẫn tệp trong db dưới dạng LongText hoặc bất cứ điều gì, vì vậy mọi FileField chúng tôi có nghĩa là chúng tôi có một trường có max_length cho dù chúng tôi chỉ định nó hay không. Do đó, tất cả các trường trên đều có max_length ngầm định . Bạn thực sự có thể tìm ra điều này bằng cách đọc mã nguồn Django.

Ví dụ về nguồn

Tôi chưa bao giờ sử dụng EmbedVideoField chẳng hạn, nhưng hóa ra là một lớp con của models.URLField , có nghĩa là nó có max_length theo mặc định được đặt thành 200 nếu bạn không chỉ định.

Hơn nữa, ImageField khác nhau của bạn s chỉ là các lớp con của FileField , max_length mặc định là 100 .

Làm cách nào để gỡ lỗi các sự cố như thế này trong tương lai?

Bây giờ, điều này không giúp chúng tôi biết cái nào trong số các trường của bạn đang gặp lỗi trong trường hợp này. Đối với điều đó, tôi có thể sẽ đặt một điểm ngắt ở đâu đó trong mã, có thể là ở đây:

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

Bằng cách "đặt điểm ngắt", ý tôi là như sau:

Đi tới dòng 65 trong mô-đun được đề cập ở trên, ebagu/main/models.py và nhập thông tin sau và lưu mô-đun:import pdb; pdb.set_trace()

(Tôi thực sự rất thích ipdb bản thân tôi, nhưng điều đó đòi hỏi Ipython, mà tôi cũng rất thích ...)

Chạy máy chủ cục bộ của bạn và chạy qua các bước gây ra sự cố này. Cuối cùng, bạn sẽ gửi biểu mẫu của mình và nếu bạn nhìn vào bảng điều khiển nơi bạn khởi động máy chủ của mình, cuối cùng bạn sẽ được đưa vào một trình bao ngay tại dòng 65. Trình bao này là pdb shell , có các quy tắc khác với shell thông thường, nhưng bạn có thể đánh giá Post sắp được lưu của mình ví dụ, bằng cách xem xét các trường khác nhau trên chính cá thể đó, self và chạy mã Python trong ngữ cảnh của cuộc gọi phương thức đó:

(pdb) len(self.image.path)

Bằng cách sử dụng đó, tôi sẽ đánh giá thủ công các trường khác nhau và xem trường nào có mục nhập thực sự dài này đang làm nghẹt quá trình lưu (có thể là một trong các trường ImageField của bạn s).

Giải pháp có cảnh báo

Ngoài ra, bạn có thể chỉ cần thêm max_length cho tất cả những điều này, nhưng hãy lưu ý rằng bạn rất có thể sẽ cần thực hiện di chuyển cơ sở dữ liệu đối với bất kỳ trường văn bản giới hạn nào bạn thay đổi vì cơ sở dữ liệu của bạn vẫn sẽ xác minh độ dài của đầu vào so với cách cột được xác định. Đây là một câu trả lời hay cho StackOverflow xem xét chính xác vấn đề này .

Chú thích cuối trang

Tại sao điều này không xuất hiện trước khi bạn chuyển sang Postgresql? Có nhiều lý do tiềm ẩn, nhưng nó có thể liên quan đến cách thiết lập cơ sở dữ liệu trước đó so với cách thiết lập cơ sở dữ liệu Postgresql (thủ công so với di chuyển Django?).

Nó cũng có thể liên quan đến việc bạn có thay đổi nơi lưu trữ những thứ này hay không. Bạn có thay đổi MEDIA của mình không cài đặt để các đường dẫn nơi các tệp được lưu trữ lâu hơn rất nhiều?

Những gì bạn thực sự nên làm là xem trực tiếp vào cơ sở dữ liệu của bạn. Mở psql ví dụ và yêu cầu nó mô tả các bảng của bạn cho bạn. Nó sẽ cho bạn biết những trường nào được giới hạn trong 100 ký tự và đó là những trường gây ra sự cố cho bạn.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQLAlchemy, Decl Compare, PostgreSQL:không thể tạo bảng

  2. Kết nối với cơ sở dữ liệu PostgreSQL thông qua đường hầm SSH bằng Python

  3. Chuyển đổi các hàng và cột (còn gọi là pivot) chỉ với COUNT () tối thiểu?

  4. Kích thước tối đa của kiểu dữ liệu TEXT trong postgresql

  5. Sự khác biệt giữa Postgres DISTINCT và DISTINCT ON là gì?