2011-08-04 72 views
4

我使用Django與現有的Oracle數據庫(即,其中表不是由Django創建的)。所以在我的模型中,我不得不通過在Meta類中爲db_table指定一個值來指定表名。由於我希望訪問的表屬於不同於我擁有憑據的用戶,因此我遇到了問題。我有權查看這些表格(在SQL Developer中沒有麻煩)。能否阻止Django截斷長表名?

當Oracle表的名稱超過30個字節時,Django會截斷名稱的最後四個字節,並將其替換爲表名剩餘部分的可重複4字節散列。這對Django自己創建的表格非常有用。對於訪問現有數據庫中的表而言,這通常也不會成爲問題(正如我的情況),因爲Oracle本身將名稱限制爲30個字節。

的問題是,Django不具有用於指出的是,表屬於另一個用戶單獨的設施。所以我用點語法的解決方法(由只設置db_table爲,例如,「USERNAME.MY_29_BYTE_TABLE_NAMEXXXXXXXX」),但由於這導致整體表名超過30個字節,Django的做它截斷伎倆,並試圖對查詢一個不存在的表名。

是否有辦法防止這種行爲,或以不同的方式來指定用戶從表的名稱分開?

+1

這聽起來像它可能是在Django合法的錯誤!你應該看看是否有在https://code.djangoproject.com/query相關的任何東西,添加一個新的機票如果不。 – SingleNegationElimination

+1

考慮一個登錄觸發器,做和ALTER SESSION SET CURRENT_SCHEMA,而不是指定所有者爲每個表 –

+0

很好的建議,無論是。如果我的理解正確,Gary的想法只有在你想訪問的所有表都屬於同一個用戶時纔有效。雖然對我來說就是這樣,但對於其他情況,下面SuperDuper建議的解決方案可能更有用。謝謝! –

回答

2

截斷是在Oracle Django DB後端由quote_name方法引起的,該方法遵循SQL92要求並使用硬編碼值max_name_length

您可以通過創建自定義數據庫後端或猴補丁像這樣覆蓋此行爲:

from django.db.backends.oracle.base import DatabaseOperations 
DatabaseOperations.max_name_length = lambda s: <NEW_MAX_VALUE> 

這真不明白爲什麼你需要在表名超過30個字符,因爲它違反了Oracle Schema Object Naming Rules

+0

這告訴我如何防止這種行爲。謝謝!實際上,我沒有指定大於30個字符的表名,Django認爲我是因爲需要額外的字節來指示用戶。我想這個解決方案將不會在情況如此可行的,你有Django的生成的表格(即使用默認的APPNAME_MODLENAME命名約定)和甲骨文預先存在的表的結構,因爲如果你提出這個值的Django真的可以嘗試創建名稱過長的表。但我想你可以通過在這種情況下總是指定db_table來控制它。 –