2016-10-06 43 views
1

我得到一個非常奇怪的數據庫錯誤:Django的 - 值過長類型字符改變(但似乎是MAX_LENGTH期限內)

psycopg2.DataError: value too long for type character varying(4) 

這時候我想保存在Question發生我的調查應用。奇怪的是:我相信我只是試圖在這個領域保存4個字符!

.save(update_fields=['question_type', 'question_text', 'quota'])調用傳遞的ModelForm驗證,所以我去了我的數據庫,看它是否真正匹配的模型,它的作用:

db=# \d surveyapp_question; 
     Table "public.surveyapp_question" 
    Column  |   Type   | Modifiers 
---------------+------------------------+----------- 
uuid   | uuid     | not null 
question_type | character varying(4) | not null 
question_text | character varying(255) | 
order   | integer    | 
quota   | smallint    | 

正如你所看到的,在模型中只有一個varchar(4)question_type。我試圖保存到該列的值是「text」。 POST數據顯示「文本」。如果我在form_valid中輸入print(form.cleaned_data['question_type'],它也會顯示text

所以我看着Postgres的日誌:

tail -f /var/log/postgresql/postgresql-9.4-main.log 
... 
UPDATE "surveyapp_question" SET "question_type" = '(''text'',)' WHERE... 

的sooo ...這看起來不正確?什麼是「''text''」?爲什麼我在這個元組中沒有"text"?那是什麼導致了錯誤?

我正在運行django 1.10,psycopg2 2.6.2和PostgreSQL 9.4.7。

+0

你可以發佈你的表單,視圖和模型嗎? –

+0

謝謝你提示Ti​​mmy--它只有當我清理公共查看的「視圖」時,我注意到一行中有一個尾隨逗號被添加到設置'self'屬性的行上。如何將其轉換成狡猾的SQL不在我身邊! – Escher

回答

1

所以在做的時候:

self.question.some_property = form.cleaned_data['some_property'], 

我附加意外尾隨逗號,而沒有引起我的特別代碼語法錯誤莫名其妙,但去的權利,通過psycopg2到數據庫作爲一個狡猾的查詢。這可能是一個非常隱蔽的錯誤,不會發生在其他任何人身上,但是如果調試過程對於人們有用,我會留下問題。

+2

只是FYI,'form.cleaned_data ['...']'是一個字符串,所以在你的表單字段(和模型)創建一個元組後,把'',''放入。嘗試's =「hello」,'在你的翻譯中,你會明白我的意思。這個元組然後被轉換成一個字符串保存到你的數據庫 –

+0

哇,謝謝你的解釋!我沒有意識到你可以在沒有括號的情況下聲明一個元組。 – Escher

相關問題