4

これは、健全性チェックの質問の 1 つです。これは非常に明白なはずです。ドライバーに何か問題があるか、明らかな何かを見落としています。

Django モデル フィールドがあります。これは、null 以外の整数フィールドで、選択肢があります。

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が唯一のタイプであるためです。

したがって、すべて正しいように見えます。

どうしたの?

4

1 に答える 1

5

私はそれを追跡しました。最高のトラッキング ダウンのように、ちょっとしたストーリーです。

最初にブレークポイントを に入れ、 でステップbackends/postgresql_psycopg2/base.pyインCursorWrapper.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;dr 更新トリガーはtsvectorフィールドの外に構築されており、タイプについて不平を言っていました。データまたはドライバーに問題はなく、トリガーが間違ったタイプのデータを実行しただけです。

于 2012-12-24T16:48:50.207 に答える