2012-01-30 31 views
14
người

Hi Stackoverflow,Làm thế nào để gỡ lỗi: Lỗi nội giao dịch vãng lai được hủy bỏ, các lệnh bị bỏ qua cho đến khi kết thúc khối giao dịch

tôi làm bước đầu tiên của tôi với GeoDjango và tôi đang tìm kiếm các lựa chọn tốt hơn để kiểm tra báo cáo lỗi sql.

Cho đến giờ, tôi chỉ muốn an toàn một điểm lng + lat trong bảng postgresql của mình.

Mô hình này được định nghĩa với:

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

    objects = models.GeoManager() 

Theo quan điểm của tôi, tôi cố gắng thực hiện lệnh sau

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

nhưng tôi nhận được lỗi sau khi tôi cố gắng để lưu các hình thức:

Loại ngoại lệ: InternalError Giá trị ngoại lệ: giao dịch hiện tại là bị hủy bỏ, các lệnh bị bỏ qua cho đến khi kết thúc khối giao dịch

Lý do cho lỗi này là gì? Tôi tin rằng có thể có điều gì đó sai trái với câu lệnh sql, nhưng cách tốt nhất để kiểm tra là gì? Django chỉ cung cấp thông báo lỗi chung "Lỗi nội bộ".

Cảm ơn sự giúp đỡ và đề xuất của bạn!

Trả lời

27

Trong hầu hết các trường hợp, điều này có nghĩa là câu lệnh SQL trước đây không thực thi được. Trong trường hợp này bạn nên:

  1. Enable SQL logging, xem đoạn sau để dán vào settings.py

  2. Set DEBUG = 1, hoặc SQL sẽ không được đăng nhập

  3. Run runserver lại, và bạn sẽ thấy tất cả các truy vấn SQL trong giao diện điều khiển

  4. Thực hiện truy vấn SQL cuối cùng trực tiếp trong cơ sở dữ liệu, sau đó bạn sẽ tìm thấy truy vấn nào không thành công và sau đó bạn có thể gỡ lỗi chúng hoặc mở câu hỏi mới dành riêng cho truy vấn gây ra sự cố. Bạn có thể sử dụng phpMyAdmin, hoặc trực tiếp một khách hàng CLI, hoặc bất kỳ máy khách cơ sở dữ liệu nào, để thực thi truy vấn SQL từng cái một cho đến khi bạn tìm thấy một yêu cầu nào đó.cấu hình Logging

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

Nếu cấu hình này không cung cấp bất kỳ đầu ra giao diện điều khiển bổ sung với runserver, sau đó cảm thấy tự do để thử django-autocomplete-light's example test_project:

  1. Đọc và dán cài đặt các lệnh trong /tmp

  2. Change dir để autocomplete_light_env/src/django-autocomplete-light/test_project

  3. mở test_project/settings.py, thay thế các cấu hình LOGGING bởi một bên trên

  4. runserver và mở trình duyệt của bạn

console của bạn sẽ trông giống như:

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

Cấu hình ghi nhật ký SQL được đề xuất của bạn không cung cấp bất kỳ tiện ích bổ sung nào bàn điều khiển ion ghi lại cho tôi. Tôi có DEBUG = True, vì vậy tôi không chắc chắn những gì khác để cố gắng thực sự nhìn thấy SQL. Tôi đã có một lỗi trong cuộc gọi .extra() của tôi, nơi tôi có lỗi đánh máy. Đã cho tôi một vài giờ để nhận thấy nó. Có thể là một miếng bánh mà tôi có thể thấy được SQL mà tôi đã tạo ra. Tôi đã nhận được vấn đề của tôi cố định, nhưng Django chắc chắn không có sự giúp đỡ. – gdonald

+2

Tôi đưa ra 1 câu trả lời của bạn, bởi vì "Trong hầu hết các trường hợp, điều này có nghĩa là câu lệnh SQL trước đó không thực hiện được." chính xác là vấn đề của tôi. Theo dõi ngăn xếp cho thấy một đối tượng không lưu, nhưng nó thực sự là một truy vấn ở trên nó. Đó là kinh nghiệm của tôi rằng dấu vết ngăn xếp Django không hữu ích chút nào trong hầu hết các trường hợp. – gdonald

+0

Tôi đang bận tâm bởi "không cung cấp ** bất kỳ đăng nhập bảng điều khiển ** bổ sung nào". Vì vậy, tôi cập nhật câu trả lời để bao gồm một cách dễ dàng để kiểm tra cấu hình LOGGING này. Điều này cho phép bạn biết nếu điều này đến frob dự án của bạn (cài đặt?) Hoặc môi trường. – jpic

Các vấn đề liên quan