2011-01-11 57 views
0

我加載使用manage.py loaddata從源碼生成到PostgreSQL數據庫的夾具加載一張長條桌的名字時,是不是一個序列。當它到達具有長名稱的ManyToManyField時加載失敗。Django的loaddata造成ProgrammingError:「......」在PostgreSQL中

我追查到數據庫適配器:usr/local/lib/python2.6/dist-packages/django/db/backends/postgresql_psycopg2/base.py線44

return self.cursor.execute(query, args)

query值是正確的:'SELECT CURRVAL(\'"a_long_long_table_name_id_seq"\')'

但隨後失敗,DatabaseError: 「a_long_long_table_name_i」 不是一個序列

顯然這個名字在執行這個語句後被切斷了,但是我不能追蹤到更深。

django版本:1.2

如何解決這個問題?

+0

Postgres中列名的最大長度是64 - 你的兩個例子都比這少得多。錯誤消息本身可能只是簡單地截斷列名。當您手動運行查詢時會發生什麼? – Seth 2011-01-11 20:47:49

回答

0

我從http://archives.postgresql.org/pgsql-novice/2003-06/msg00239.php找到答案,postgres表名最大限制爲63.要提高這個限制,必須更改其源代碼並將NAMEDATALEN設置爲更高的值。但問題是,在Django中,超過這個限制是非常容易的,因爲多對多字段的關聯表名通常採用以下格式:application_name_model1_name_model2_name

無論如何,我決定縮短模型名稱而不是重新 - 編譯源代碼。

0

你知道你可以使用應用程序標籤和db_table來具體告訴數據庫什麼名字應該用作表名,對吧?這意味着您不應該縮短模型的名稱,但要保持它們的描述性。

據我所知,Postgres將截斷在創建數據庫表(和字段)的名稱,使用功能,將總是產生相同的名稱。這應該意味着只有燈具需要修改。確定Postgres中的實際名稱,並對燈具數據進行查找替換。