2011-01-11 3 views
0

sqliteから生成されたフィクスチャを、manage.py loaddataを使用してpostgresqlデータベースにロードします。長い名前のManyToManyFieldに到達すると読み込みに失敗しました。django loaddataによってProgram Errrorが発生しました: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

+0

'a_long_long_table_name_'はこれよりかなり長い実際のテーブル名ではありません。したがって、テーブル名は64文字未満でなければならないという厳しい制限があります。 – lcltj

答えて

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内の実際の名前を特定し、フィクスチャーデータで置換を検索します。

関連する問題