2010-09-27 32 views
12

我有一個fixture(json),它在開發環境中加載但在服務器環境中無法這樣做。錯誤說:「DatabaseError: value too long for type character varying(50)Django fixture失敗,陳述「DatabaseError:值太長,因爲字符類型變化(50)」

我的開發環境是Windows & Postgres 8.4。服務器運行Debian和Postgres 8.3。數據庫編碼在兩個系統中都是UTF8。

就像燈具中的unicode標記計算在服務器上的字符一樣,它們會導致某些字符串超出其字段的最大長度。但是,在開發環境中不會發生這種情況。

回答

7

那麼,區別在於模板數據庫的編碼。在生產服務器上,他們使用ascii編碼,而在開發盒上是utf-8。

默認情況下,postgres使用template1創建數據庫。我的理解是,如果它的編碼不是utf-8,那麼即使你使用utf-8編碼創建它,你創建的數據庫也會遇到這個問題。

因此,我放棄了它,並將其編碼設置爲UTF8來重新創建它。下面的代碼片段做它(從here拍攝):

psql -U postgres 

UPDATE pg_database SET datallowconn = TRUE where datname = 'template0'; 
\c template0 
UPDATE pg_database SET datistemplate = FALSE where datname = 'template1'; 
drop database template1; 
create database template1 with template = template0 encoding = 'UNICODE'; 
UPDATE pg_database SET datistemplate = TRUE where datname = 'template1'; 
\c template1 
UPDATE pg_database SET datallowconn = FALSE where datname = 'template0'; 

現在燈具負荷平穩。

+0

非常感謝 - 解決了utf8的整個問題通過django測試創建數據庫。 – RichVel 2013-01-06 08:54:46

1

在兩個系統上獲取真正的SQL查詢,看看有什麼不同。

+0

不錯的提示+1,還有以上檢查服務器日誌。 – 2013-01-06 09:00:18

10

更新:在Django 1.8

的50個字符限制is now 255 -

原來的答覆:

我只是遇到了這個下午,也和我有(各種)修復

這個post here意味着它是一個Django的bug,與auth_permission允許的值的長度有關。進一步挖掘備份這個想法,就像this Django ticket(儘管它最初與MySQL相關)。

基本上,根據模型的verbose_name和描述權限字符串創建權限名稱,並且該權限名稱可以溢出到超過auth.models.Permission.name中允許的50個字符。

引述的Django的門票評論:

The longest prefixes for the string value in the column auth_permission.name are "Can change " and "Can delete ", both with 11 characters. The column maximum length is 50 so the maximum length of Meta.verbose_name is 39.

一個解決辦法是破解該列支持> 50個字符(最好通過南遷,我說,所以它很容易重複的),但我能想到的最快,最可靠的修復方法就是使我的超長verbose_name定義更短(從verbose_name中的47個字符到20個左右)。現在一切正常。

+0

感謝您的回覆,但您的解決方案僅限於身份驗證。不幸的是,任何字符字段似乎都能夠引發我的錯誤。 – shanyu 2010-09-28 20:41:21

+0

它不會是任何charfield - 它只會是那些長度爲50個字符的字符。用--verbosity = 2運行syncdb,看看哪一個是特別窒息的,這可能會讓你看到哪些模型實際上導致了痛苦。另外,Debian框中的語言環境是否正確?我記得它默認爲UTF8或16以外的地方(取決於你在哪裏)(例如,在GB中,它默認爲LATIN1,當輸入非ASCII字符時它會發生爆炸) – 2010-09-28 20:44:54

1

只爲信息:我也有過這樣的錯誤

DatabaseError: value too long for type character varying(10) 

看來,我用的10場的極限寫入數據。我固定它通過增加CharField的尺寸從10至20

我希望它能幫助

1

由於@stevejalim說,這很可能是列auth_permission.name是長度爲50的問題,您驗證此在postgres的shell中使用\ d + auth_permission。在我的情況下,這是問題,因此當我加載Django模型的燈具時,我得到「DatabaseError:值太長,因爲字符變化(50)」,然後更改django.contrib.auth的權限模型是複雜的,所以...簡單解決方案是在Permission模型上執行遷移,我在postgres的shell中運行ALTER TABLE auth_permission ALTER COLUMN name TYPE VARCHAR(100);命令,這對我很有用。

學分this comment

1

您可以Django的使用它來創建數據庫表之前使用更長的字段這個模型由猴子修補模型。在 「manage.py」,更改:

if __name__ == "__main__": 
    execute_manager(settings) 

到:

from django.contrib.auth.models import Permission 
if __name__ == "__main__": 
    # Patch the field width to allow for our long model names 
    Permission._meta.get_field('name').max_length=200 
    Permission._meta.get_field('codename').max_length=200 
    execute_manager(settings) 

此之前修改(比如)manage.py syncdb運行在球場上的選項,所以databate表具有良好的寬VARCHAR()領域。調用您的應用程序時不需要執行此操作,因爲您從不嘗試修改正在運行的權限表。

相關問題