2012-01-30 10 views
14

こんにちはStackOverflowの人まで無視コマンド、どのようにデバッグするには:内部エラー現在のトランザクションが中止され、トランザクションブロックの終了

私はGeoDjangoと私の最初のステップを行うと、私は障害のあるSQL文を確認するためのより良い選択肢を探しています。

これまでのところ、私はpostgresqlテーブルのlng + latポイントを安全にしたかっただけです。

モデルを使用して定義されています。私の見解では

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

を実行しようとするが、私は、フォームを保存しようとすると、私は次のエラーが表示されます

例外タイプ:InternalError 例外値:現在のトランザクションはです。が中断され、トランザクションブロックの終了までコマンドが無視される

このエラーの原因は何ですか?私は、SQLステートメントに何か間違っている可能性があると信じていますが、何が最良の方法を確認するのですか? Djangoは一般的なエラーメッセージ "Internal Error"を提供します。

はあなたの助けと提案をありがとう!

答えて

27

は、ほとんどの場合、これは以前 SQL文が実行に失敗したことを意味します。

  1. settings.py

  2. 設定DEBUG = 1、またはSQLが

  3. に記録されませんに貼り付けるには、次のスニペットを参照してください、SQL logging
    を有効にする:この場合、あなたがすべきで
  4. runserverをもう一度に実行すると、すべてのSQLクエリがコンソールに表示されます。

  5. は、あなたが失敗したクエリを見つける必要があり、データベースに直接最後のSQLクエリを実行し、その後、あなたはそれらをデバッグすることができるはず - または問題が発生したクエリに固有の新しい質問を開きます。あなたはphpMyAdminのを使用するか、または直接CLIクライアント、または任意のデータベースクライアント、あなたはいくつかの愛を必要とするものを見つけるまで、一つ一つを照会SQLを実行することができます。

SQLロギングの設定:

  1. 読むとインストールを貼り付けます。

    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', 
         }, 
        } 
    } 
    

    この構成はdjango-autocomplete-light's example test_projectを試すこと自由に感じ、その後、runserverで追加のコンソール出力を提供していない場合コマンドは/tmp

  2. オープンtest_project/settings.pyautocomplete_light_env/src/django-autocomplete-light/test_project

  3. から

    変更ディレクトリに、RUNSERVER

  4. 上記のいずれかによって LOGGING設定を交換し、ブラウザを開い

あなたのコンソールには、次のようになります。

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=[] 
+1

推奨されるSQLロギング設定では、私のためのイオンコンソールロギング。私はDEBUG = Trueを持っているので、実際にSQLを見るために他に何をしようとしているのか分かりません。 .extra()呼び出しでエラーが発生しました。私はどこでタイプミスがあったのですか。それに気付くまでに数時間かかりました。私が生成していたSQLを見ることができたのであれば、ケーキだったでしょうか。私の問題は修正されましたが、Djangoは何の助けもないと確信していました。 – gdonald

+2

"ほとんどの場合、これは前のSQL文が実行に失敗したことを意味するため、あなたの答えに+1を与えています。"私の問題はまさにそのケースでした。スタックトレースはオブジェクトの保存に失敗したことを示していましたが、実際はその上にあるクエリでした。私の経験では、Djangoのスタックトレースはほとんどの場合役に立ちません。 – gdonald

+0

私は "**すべての追加の**コンソールロギングを提供していません"という心配です。だから私はこのLOGGING設定をテストする簡単な方法を含める答えを更新しました。これは、あなたのプロジェクト(設定?)または環境が表示されているかどうかを知ることができます。 – jpic

関連する問題