2012-11-13 30 views
6

Tôi đang cố giải quyết một lỗi rất khó hiểu trong ứng dụng Django. Khi DEBUG = False, cố gắng để xóa một người dùng (thông qua user.delete()) cho lỗi cơ sở dữ liệu này:Lỗi cơ sở dữ liệu Django: thiếu bảng social_auth_usersocialauth khi social_auth chưa được cài đặt

DatabaseError: relation "social_auth_usersocialauth" does not exist 
LINE 1: ...", "social_auth_usersocialauth"."extra_data" FROM "social_au... 

Tuy nhiên, tôi không có social_auth hoặc bất cứ điều gì bởi một tên tương tự ở INSTALLED_APPS, cũng không có bất kỳ bảng như vậy trong tôi cơ sở dữ liệu, cũng như bất kỳ mã nào của tôi tham chiếu đến bất kỳ thứ gì sắp xếp (tôi chạy tìm kiếm văn bản trên 'xã hội' trong toàn bộ thư mục dự án) - và một lần nữa, nó hoạt động tốt khi DEBUG = True. social_auth được cài đặt trên hệ thống của tôi và trên PYTHONPATH của tôi, nhưng tôi không thể thấy ứng dụng này đang nhận ý tưởng ở đâu khi có bảng social_auth trong cơ sở dữ liệu của nó, hãy nói một mình tại sao nó chỉ nghĩ vậy khi DEBUG = False.

Ứng dụng của tôi có thể có được cách nào để có được bảng này và cách tôi có thể thuyết phục nó không được phép ở đó?

+0

Bạn có thể nhận được truy xuất không? (Một số đầu mối là hữu ích bởi vì thử nghiệm "nếu settings.DEBUG" là rất thường xuyên trong nguồn Djano hơn 30 lần.) Có thể gửi một traceback bởi http://dpaste.org/ – hynekcer

+1

http://dpaste.org/ONeeT/ – antialiasis

+0

Mã cho xóa trong django.db không được gọi từ django.contrib.admin như tôi mong đợi nhưng từ callback để 'tastypie' thông qua mã của bạn trong' django_projects/kinwins-sever/kinwins/apps/users/api.py'. Sau đó, không thể suy nghĩ về hành vi DEBUG lạ nếu một mã không Django là giữa. Ở phía bên kia, bạn có thể dễ dàng đăng nhập truy vấn có vấn đề. Tôi tiếp tục trong phản hồi của tôi do hình thành .. – hynekcer

Trả lời

-1

Bảng này được tạo bởi ứng dụng django-social-auth.

Có vẻ như bạn đã thêm nó vào dự án của mình và chưa khởi chạy migrate (hoặc syncdb).

+0

Như tôi đã xác định trong mô tả sự cố, mặc dù, tôi không thực sự có nó hoặc bất cứ điều gì khác có bảng có thể hợp lý được tiền tố bởi social_auth trong INSTALLED_APPS của tôi, cũng không phải là nó được tham chiếu bởi bất kỳ mã nào của tôi. Tôi đã thử nghiệm với các ứng dụng của bên thứ ba khác nhau và tôi có thể đã thử thêm django-social-auth vào dự án đó trước khi quyết định không phải thứ tôi đang tìm kiếm, nhưng nếu tôi đã gỡ cài đặt ứng dụng này từ lâu và xóa tất cả dấu vết của nó theo như tôi thấy - tôi không thấy bất kỳ lý do nào có thể nó vẫn nên tìm kiếm những bảng đó. – antialiasis

+0

(Và để xác nhận, '' syncdb'' không cố gắng tạo bất kỳ bảng django-social-auth nào và '' di chuyển django-social-auth'' hoặc '' migrate social_auth'' cho tôi biết không có ứng dụng nào như vậy.) – antialiasis

+0

Vâng, có thể một số ứng dụng đã cài đặt yêu cầu django-social-auth? – Melevir

1

Sự cố có thể xảy ra do lưu quan hệ chung được thực hiện bởi Django content types. Các mối quan hệ trong Django không chỉ tĩnh, được thực hiện bởi các mô hình và INSTALLED_APPS mà còn được thực hiện bởi bảng django_content_type để lưu ánh xạ từ một id số vào mô hình + app_label. Một ví dụ về mối quan hệ năng động có thể là sự cho phép hoặc nhận xét. Bạn có thể có hoặc không có sự cho phép đối với bất kỳ bảng nào của bất kỳ ứng dụng đã cài đặt nào. Bạn có thể viết nhận xét cho mọi thứ, ví dụ: một bài viết, cho người dùng vào nhận xét mà không thay đổi bất kỳ mô hình nào. Mối quan hệ này được thực hiện bằng cách lưu id số của ContentType liên quan đến mô hình đó (bảng) và khóa chính của đối tượng liên quan (hàng).

Django không ngờ rằng ai đó có thể thao tác cơ sở dữ liệu theo cách thủ công. Nếu bạn sử dụng south để thao tác sau đó nếu bạn sau khi gỡ cài đặt một ứng dụng sau đó chạy syncdb, bạn được hỏi theo hướng nam nếu bạn muốn tự động xóa các loại nội dung độc hại. Sau đó, các bảng không sử dụng được gỡ bỏ một cách an toàn mà không cần phải tham chiếu sau này.

(Có khả năng hack: delete from django_content_type where app_label='social_auth' nhưng south là unfallible.)

Nhiều bộ phận của câu hỏi vẫn còn mở.

Sửa:
Tại sao nó không phải là đúng cách: Tất cả các mối quan hệ chung là từ hậu duệ cho phụ huynh và tất cả dữ liệu về mối quan hệ được lưu trong hậu duệ. Nếu ứng dụng con bị xóa khỏi INSTALLED_APPS thì mã django.db có thể không bao giờ cố gắng loại bỏ hậu duệ vì nó không thể nhận ra cột nào chứa dữ liệu quan hệ.

+0

Điều này trông rất hứa hẹn, nhưng tôi đã sử dụng miền Nam và '' syncdb'' không phát hiện bất kỳ loại nội dung mồ côi nào, và '' CHỌN DISTINCT app_label FROM django_content_type'' không khiến tôi '' social_auth'' (hoặc bất cứ điều gì khác mà không nên có), nhưng lỗi vẫn còn xảy ra. – antialiasis

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