2012-11-13 45 views
6

我試圖在Django應用程序中處理一個非常令人費解的錯誤。當DEBUG =假,試圖刪除用戶(通過user.delete())給出了這樣的數據庫錯誤:Django數據庫錯誤:缺少表social_auth_usersocialauth未安裝social_auth時

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

不過,我沒有social_auth或任何由INSTALLED_APPS一個相似的名字,也沒有任何這樣的表我數據庫,我的任何代碼也沒有引用任何類型的東西(我在整個項目文件夾中對'社交'進行了文本搜索) - 並且再次,當DEBUG = True時,它可以正常工作。 social_auth安裝在我的系統和我的PYTHONPATH上,但我看不到這個應用程序在哪裏得到它應該在其數據庫中存在social_auth表的想法,更不用說爲什麼只有在DEBUG = False時才這樣認爲。

我的應用程序可能獲得此表的哪些可能路徑,我如何說服它不應該在那裏?

+0

你能找到回溯嗎? (一些線索是有用的,因爲測試「if settings.DEBUG」在Djano源代碼中非常頻繁地超過30次。)也許發送回溯http://dpaste.org/ – hynekcer

+1

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

+0

django.db中的刪除代碼並不像我期望的那樣從django.contrib.admin調用,而是通過'django_projects/kinwins-sever/kinwins/apps/users/api.py'中的代碼回調到'tastypie'。如果非Django代碼介於兩者之間,那麼就不可能考慮奇怪的DEBUG行爲。另一方面,您可以輕鬆記錄有問題的查詢。由於格式化,我繼續響應.. – hynekcer

回答

-1

此表格由django-social-auth應用程序創建。

看起來您已將其添加到您的項目並且尚未啓動migrate(或syncdb)。

+0

正如我在問題描述中指出的那樣,實際上我沒有它或其他任何其他表可能明顯地以我的INSTALLED_APPS中的social_auth作爲前綴的表,也不是由我的任何代碼引用。我已經嘗試了各種第三方應用程序,並且我可能會簡單地嘗試將django-social-auth添加到該項目中,然後再決定它不是我正在尋找的內容,但如果是這樣,我很久以前就卸載了它並刪除了它的所有痕跡據我所知 - 我沒有看到任何可能的原因,它應該仍然在尋找這些表。 – antialiasis

+0

(並確認''syncdb''不會嘗試創建任何django-social-auth表,並且''migrate django-social-auth''或'migrate social_auth''告訴我沒有這樣的應用程序。 ) – antialiasis

+0

那麼,可能是一些已安裝的應用程序需要django-social-auth? – Melevir

1

問題可能是由保存的通用關係造成的Django content types實現的。 Django中的關係不僅是靜態的,通過模型和INSTALLED_APPS實現,還可以通過表django_content_type實現動態實現,從而將映射從數字標識保存到app_label +模型。可能的動態關係的一個例子是許可或評論。您可以擁有或沒有任何已安裝應用程序的任何表的權限。您可以對所有內容(例如文章)發表評論,也可以在不改變任何模型的情況下向用戶發表評論。這種關係是通過保存與該模型(表格)相關的ContentType的數字id和相關對象(行)的主鍵來實現的。

Django並不期望有人可以手動操作數據庫。如果您使用south進行操作,那麼如果您在卸載應用程序後運行syncdb,則南方會詢問您是否要自動刪除orphant內容類型。然後可以將未使用的表格安全地移除,而不會在以後引用。

(可能的黑客攻擊:delete from django_content_type where app_label='social_auth'south是unfallible。)

問題的許多部分仍然是開放的。

編輯
爲什麼這是不正確的做法:所有通用的關係是從後代父約關係中的所有數據都保存在後代。如果將子應用程序從INSTALLED_APPS中移除,則django.db代碼無法再嘗試刪除後代,因爲它無法識別哪些列包含關係數據。

+0

這看起來很有希望,但我一直在使用South和''syncdb''沒有檢測到任何孤立的內容類型,而''SELECT DISTINCT app_label FROM django_content_type''沒有讓我得到''social_auth''(或任何東西否則不應該在那裏),但錯誤仍在發生。 – antialiasis