31

私はDjangoでアプリケーションに取り組んでいます。まず、簡単にするために、データベースには sqlite3 を使用していました。

しかし、PostgreSQL に移行してから、少し問題が発生しました。テーブルをクリアすると、主キーがリセットされません。

このアプリは、長期間 (数週間) プレイするゲームです。そのため、新しいゲームが開始されるたびに、すべてのデータがデータベースから消去され、新しいランダム化されたデータが追加されます。

1ゲームをクリーンアップ/再構築するたびに 、主キーを使用して「最初からやり直す」ことができるようにしたいと考えています。

コードはそのままでも機能しますが、整数はゲーム内のオブジェクトを記述するための非常に自然な方法です。最後のゲームが中断した場所ではなく、新しいゲームをそれぞれ 1 から開始したいと思います。

PostgreSQL の主キー カウンターをリセットするにはどうすればよいですか? とにかく消去しているので、テーブル内のデータを保持する必要がないことに注意してください。

4

6 に答える 6

38

アプリディレクトリでこれを試してください:

python manage.py help sqlsequencereset

実際にリセットを実行するには、次のように psql にパイプします。

python manage.py sqlsequencereset myapp1 myapp2 | psql

編集:これは、私のテーブルの1つでこのコマンドからの出力の例です:

BEGIN;
SELECT setval('"project_row_id_seq"', coalesce(max("id"), 1), max("id") IS NOT null) FROM "project_row";
COMMIT;
于 2009-02-13T07:04:30.870 に答える
18

「Van Gale」が示唆するように、実行中の問題を解決するコマンドを取得できますsqlsequencereset

また

sqlsequenceresetこの方法で Python 内から生成された SQL クエリを実行できます(デフォルト データベースを使用):

from django.core.management.color import no_style
from django.db import connection

from myapps.models import MyModel1, MyModel2


sequence_sql = connection.ops.sequence_reset_sql(no_style(), [MyModel1, MyModel2])
with connection.cursor() as cursor:
    for sql in sequence_sql:
        cursor.execute(sql)

このコードをPython3.6Django 2.0、およびPostgreSQL 10でテストしました。

于 2018-05-10T15:20:56.613 に答える
6

生のSQLを実行する場合、これを行うことができます:

ALTER SEQUENCE youApp_id_seq RESTART WITH 1;

ドキュメント: http://www.postgresql.org/docs/8.2/static/sql-altersequence.html

于 2011-12-20T19:44:58.847 に答える
1

私は、自動インクリメント主キーをデータベース レコードの純粋な内部識別子と見なしており、それらをユーザーに公開するのは好きではありません。確かに、それらを URL の一部として使用するのは一般的な設計ですが、スラッグやその他の識別子を使用した方がより適切に感じられます。

于 2009-02-14T11:57:03.997 に答える