2012-12-23 48 views
2

這是那些健康檢查問題之一。這應該是非常明顯的。無論是司機的事情,還是我忽視了一些顯而易見的事情。Django Postgres錯誤,字段「不是字符類型」

我有一個Django模型字段。它是一個整數字段,非空,並帶有選項。

PROVENANCE_X = 0 
PROVENANCE_Y = 1 

PROVENANCE_CHOICES = [ 
    (PROVENANCE_X, "Provenance X"), 
    (PROVENANCE_Y, "Provenance Y") 
] 

在模型:

provenance = models.IntegerField(choices=PROVENANCE_CHOICES, default=PROVENANCE_X) 

只是爲了檢查,這裏的Postgres這樣說:

provenance  | integer     | not null 

當我保存模型在管理我得到一個錯誤。

DatabaseError 
column "provenance" is not of a character type 

有沒有自定義管理員的東西。這個錯誤完全在Django代碼中,但我不知道在哪裏。我把一個斷點在save方法只是爲了檢查,立即調用超級前:

(Pdb) print self.provenance 
0 

所以是一些代碼,某個地方,試圖插入一個字符,而不是一個整數?

錯誤來自django/db/backends/postgresql_psycopg2/base.py

在當地人該堆棧幀中的查詢變量:

'INSERT INTO "MODEL" ("A", "provenance", "B", "C") VALUES (%s, %s, %s, %s) RETURNING "MODEL"."id"' 
args 
(False, 
0, 
u'test', 
'098f6bcd4621d373cade4e832627b4f6', 
) 

這表明查詢生成接收到正確的參數(0)。注意'%s'不是標準格式的佔位符,因爲Django查詢編譯器%s是唯一的類型。

所以這一切看起來是正確的。

發生了什麼事?

+0

我已經在'MySQL'和'PostgreSQL'中實現了模型,並且能夠保存'ModelForm'沒有任何錯誤:O –

+0

是的,表單已經工作過。某處發生了某些變化,我試圖診斷出什麼。我已經重新安裝最新的Django 1.3 – Joe

回答

1

我追查下來。就像最好的追蹤,一個故事。

首先,我在backends/postgresql_psycopg2/base.pyCursorWrapper.execute中放置了一個斷點,並確定無法使用pdb,因此它必須是C模塊。

因此,我搜索了「不是字符類型」的確切錯誤,這導致我使用全文搜索中使用的tsvector的源PostgreSQL代碼。行:

01419   if (!is_text_type(SPI_gettypeid(rel->rd_att, numattr))) 
01420    ereport(ERROR, 
01421      (errcode(ERRCODE_DATATYPE_MISMATCH), 
01422      errmsg("column \"%s\" is not of a character type", 
01423    trigger->tgargs[i]))); 

發現在http://doxygen.postgresql.org/tsvector__op_8c_source.html

所以它試圖創建的tsvector出有問題的領域。

所以我看了一下這個模式,看看我有沒有觸發器。

Triggers: 
MY_TRIGGER BEFORE INSERT OR UPDATE ON MY_TABLE FOR EACH ROW EXECUTE PROCEDURE tsvector_update_trigger('text_index', 'pg_catalog.english', 'X', 'Y', 'Z', 'provenance') 

我已經忘記了這一點。我不知道爲什麼它以前工作,然後停止工作,但這是問題。

TL;博士 的更新觸發,建造了tsvector出了場,並抱怨的類型。數據或驅動程序沒有問題,只是觸發執行錯誤類型的數據。

+1

與激光聖潔的飛行廢話!這正是我面臨的問題!謝啦! :d –

相關問題