2016-11-21 9 views
0

特定のテーブルに新しいオブジェクト(Djangoの用語で)がたくさん作成されているアプリケーションがあるとします。削除される文字の数を気にする必要はありませんが、テーブルを機能的に保つだけで十分です。DjangoテーブルがID/PKカラムのmaxにヒットした場合はどうなりますか?

ID/PK列のテーブルの最大値に達することはありません。次は何が起こる? Djangoはどのようにその状況を処理しますか?

+0

試しましたか?それをやり遂げるのは難しくないようです。 – allcaps

+0

まだありません。そこを冒険する前に誰かがそれについての経験を持っていたかどうか聞きたい。 – beruic

+0

postgresの場合、オブジェクトのIDを2147483647に設定してからもう一度試してみることができます。 – allcaps

答えて

2

私は2147483648のidをPostgresデータベースで設定しようとしました。 DjangoはDataError: integer out of rangeを発生させます。私がPostgresで同じことをしようとすると、私は[22003] ERROR: integer out of rangeになる。だから、Djangoはdbエラーをスローするように見えます。

DataErrorのDjangoソースコードを検索すると、 https://github.com/django/django/blob/3c447b108ac70757001171f7a4791f493880bf5b/django/db/utils.py#L53が見つかり、Djangoがバックエンド固有のデータベース例外を再スローすることが確認されています。

あなたは常に自分自身を主キーフィールドを定義し、それをマークすることができ、主として:

id = models.BigIntegerField(primary_key=True) 

する。これは、IDのフォーム2147483647それはUUIDに十分にスイッチされていない場合

9223372036854775807に増加します

id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) 

https://docs.djangoproject.com/en/1.10/topics/db/models/#automatic-primary-key-fieldshttps://docs.djangoproject.com/en/1.10/ref/models/fields/#bigintegerfieldhttps://docs.djangoproject.com/en/1.10/ref/models/fields/#uuidfield

+2

1.10では、自動増分動作を維持したい場合に備えて、['BigAutoField'](https://docs.djangoproject.com/en/1.10/ref/models/fields/#bigautofield)を追加しました。 – knbk

+0

この回答は素晴らしいです。また、問題が発生した場合に問題から移行することが可能であることも示しています。私は自分のデータ型に外部キーを設定できることを知っていました。この質問をすることのポイントは、エラーがどのように表示されるのかを実際には分からず、検索することで何も見つかりませんでした。 – beruic

関連する問題