2015-03-24 2 views
7

Есть ли способ получить соответствующее имя таблицы и столбца, а не только это сообщение?Django ORM: Получить столбец DataBaseError

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

Я не хотел угадывать или искать соответствующую колонку.

Мы используем Джанго 1.6 и PostgreSQL 9.3.6

Полный отслеживающий

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

Просьба показать полную ошибку и трассировку. –

+0

@ DanielRoseman Я добавил следы (часть django). – guettli

+0

У меня было что-то похожее, и это оказалось ограничением на поле в стороннем приложении, а не на моем. Возможно ли это с учетом действия, которое вы пытаетесь сделать, когда это произойдет? –

ответ

2

Там нет никакого способа, чтобы просто выяснить.

Джанго здесь просто цитирует то, что говорит БД, и это вина Postgres:

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

PostgreSQL не сказать вам, какой из них слишком долго, так что нет никакого способа, Джанго мог узнать, слишком.

Обходной будет проверять каждый ввод вручную, чтобы соответствовать max_length (я не уверен, что о точной реализации на Джанго 1.6, хотя, это 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) 

Вы можете, конечно, настроиться на исключение из ваших потребностей, чтобы упростить доступ к длинному названию поля или посмотреть, сколько его длинного символа или ...

+0

Невозможно сказать postgres, чтобы быть более подробным? – guettli

+1

@guettli Предложение упоминания столбца в сообщениях об ошибках в настоящее время обсуждается разработчиками psql ... –