Как выполнить отладку: Внутренняя ошибка: текущая транзакция отменена, команды игнорируются до конца блока транзакции. - PullRequest
14 голосов
/ 30 января 2012

Привет Stackoverflow люди,

Я делаю свои первые шаги с GeoDjango и ищу лучшие варианты для проверки неверных операторов SQL.

Пока что я просто хотел сохранить точку lng + lat в моей таблице postgresql.

Модель определяется с помощью:

    geolocation = models.PointField(_('Geo Location'), 
                geography=True, 
                null = True, 
                blank = True,
                help_text=_('Geolocation with Longitude and Latitude'))

    objects = models.GeoManager()

На мой взгляд, я пытаюсь выполнить следующую команду

savedProject.geolocation = GEOSGeometry('POINT(%s %s)' %(u_lng,u_lat))

но я получаю следующую ошибку при попытке сохранить форму:

Тип исключения: внутренняя ошибка Значение исключения: текущая транзакция прервано, команды игнорируются до конца блока транзакции

В чем причина этой ошибки? Я считаю, что может быть что-то не так с оператором SQL, но как лучше проверить? Джанго просто выдает общее сообщение об ошибке «Внутренняя ошибка».

Спасибо за вашу помощь и предложения!

1 Ответ

27 голосов
/ 30 января 2012

В большинстве случаев это означает, что не удалось выполнить SQL-оператор предыдущий . В этом случае вы должны:

  1. Включить SQL регистрация , см. Следующий фрагмент для вставки в settings.py

  2. Установите DEBUG = 1 , иначе SQL не будет зарегистрирован

  3. Запустите runserver снова , и вы должны увидеть все SQL-запросы в консоли

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

Настройка ведения журнала SQL:

LOGGING = { 
   'version': 1,
   'disable_existing_loggers': True,
   'formatters': {
       'simple': {
           'format': '%(levelname)s %(message)s',
       },  
   },  
   'handlers': {
       'console':{
           'level':'DEBUG',
           'class':'logging.StreamHandler',
           'formatter': 'simple'
       },  
   },  
   'loggers': {
       'django': {
           'handlers': ['console'],
           'level': 'DEBUG',
       },  
   }   
}

Если эта конфигурация не предоставляет никакого дополнительного вывода на консоль с runserver, то можете попробовать пример django-autocomplete-light test_project :

  1. Прочитайте и вставьте команды установки в /tmp

  2. Изменить каталог на autocomplete_light_env/src/django-autocomplete-light/test_project

  3. Открыть test_project/settings.py, заменить конфигурацию LOGGING на приведенную выше

  4. Запустите сервер и откройте ваш браузер

Ваша консоль будет выглядеть так:

Validating models...

0 errors found
Django version 1.4.1, using settings 'test_project.settings'
Development server is running at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
DEBUG (0.001) SELECT "django_content_type"."id", "django_content_type"."name", "django_content_type"."app_label", "django_content_type"."model" FROM "django_content_type" WHERE ("django_content_type"."model" = taggable  AND "django_content_type"."app_label" = charfield_autocomplete ); args=('taggable', 'charfield_autocomplete')
DEBUG (0.000) 
        SELECT DISTINCT "tagging_tag".id, "tagging_tag".name
        FROM
            "tagging_tag"
            INNER JOIN "tagging_taggeditem"
                ON "tagging_tag".id = "tagging_taggeditem".tag_id
            INNER JOIN "charfield_autocomplete_taggable"
                ON "tagging_taggeditem".object_id = "charfield_autocomplete_taggable"."id"

        WHERE "tagging_taggeditem".content_type_id = 11

        GROUP BY "tagging_tag".id, "tagging_tag".name

        ORDER BY "tagging_tag".name ASC; args=[]
...