2015-03-24 11 views
7

Czy istnieje sposób na uzyskanie odpowiedniej nazwy tabeli i kolumny, a nie tylko tej wiadomości?Django ORM: Pobierz kolumnę DataBaseError

django.db.utils.DataError: value too long for type character varying(16) 

Nie lubię odgadywać ani wyszukiwać odpowiedniej kolumny.

Używamy Django 1.6 i PostgreSQL 9.3.6

Pełna traceback

File "/home/f/local/lib/python2.7/site-packages/django/db/models/base.py", line 545, in save 
    force_update=force_update, update_fields=update_fields) 
    File "/home/f/local/lib/python2.7/site-packages/django/db/models/base.py", line 573, in save_base 
    updated = self._save_table(raw, cls, force_insert, force_update, using, update_fields) 
    File "/home/f/local/lib/python2.7/site-packages/django/db/models/base.py", line 654, in _save_table 
    result = self._do_insert(cls._base_manager, using, fields, update_pk, raw) 
    File "/home/f/local/lib/python2.7/site-packages/django/db/models/base.py", line 687, in _do_insert 
    using=using, raw=raw) 
    File "/home/f/local/lib/python2.7/site-packages/django/db/models/manager.py", line 232, in _insert 
    return insert_query(self.model, objs, fields, **kwargs) 
    File "/home/f/local/lib/python2.7/site-packages/django/db/models/query.py", line 1514, in insert_query 
    return query.get_compiler(using=using).execute_sql(return_id) 
    File "/home/f/local/lib/python2.7/site-packages/django/db/models/sql/compiler.py", line 903, in execute_sql 
    cursor.execute(sql, params) 
    File "/home/f/local/lib/python2.7/site-packages/django/db/backends/util.py", line 69, in execute 
    return super(CursorDebugWrapper, self).execute(sql, params) 
    File "/home/f/local/lib/python2.7/site-packages/django/db/backends/util.py", line 53, in execute 
    return self.cursor.execute(sql, params) 
    File "/home/f/local/lib/python2.7/site-packages/django/db/utils.py", line 99, in __exit__ 
    six.reraise(dj_exc_type, dj_exc_value, traceback) 
    File "/home/f/local/lib/python2.7/site-packages/django/db/backends/util.py", line 53, in execute 
    return self.cursor.execute(sql, params) 
django.db.utils.DataError: value too long for type character varying(16) 
+0

Pokaż pełny błąd i informacje zwrotne. –

+0

@DanielRoseman Dodałem traceback (część django). – guettli

+0

Miałem coś podobnego, a skończyło się na ograniczeniu na polu w aplikacji innej firmy, a nie jednej z moich. Czy to możliwe, biorąc pod uwagę akcję, którą próbujesz, kiedy to się stanie? –

Odpowiedz

2

Nie ma sposobu, aby dowiedzieć się, po prostu.

Django tutaj tylko cytuje, co mówi DB, a to z winy PostgreSQL:

db=> INSERT INTO db_accesskeys (key, link) VALUES ('AAAAA...', 'BBBBB...'); 
ERROR: value too long for type character varying(40) 

PostgreSQL nie powiedzieć, który z nich jest zbyt długa, więc nie ma sposobu, Django mogli dowiedzieć się, także.

Rozwiązaniem byłoby zweryfikować każde wejście ręcznie dopasować max_length (nie jestem pewien co do dokładnej realizacji na Django 1.6 choć jest to 1.8):

def validate_length(model, field, value): 
    if len(value) > model._meta.get_field(field).max_length: 
     raise Exception(
      field + " of " + model._meta.model_name + " is too long (" + str(len(value)) + " > " + 
      str(model._meta.get_field(field).max_length) + ")" 
    ) 


validate_length(AccessKeys, "key", "AAAAAAA...") 
Exception: key of accesskeys is too long (109 > 40) 

Można oczywiście w zgodzie wyrzucony wyjątek od twoich potrzeb, aby ułatwić dostęp do nazwy pola, która jest długa, lub aby zobaczyć, ile dokładnie znaków jest długich lub ...

+0

Czy nie ma sposobu, aby powiedzieć postgres być bardziej szczegółowe? – guettli

+1

@guettli Propozycja wymieniania kolumn w komunikatach o błędach jest obecnie omawiana przez programistów psql ... –

Powiązane problemy