web-dev-qa-db-ja.com

IntegrityError:postgresがダンプから復元した後、ForeignKeyを含むすべてのモデル/フィールドの列「id」のnull値

私が持っているローカルpostgresデータベースの復元からheroku postgresデータストアを使用しようとすると、問題が発生します。復元されたpostgresデータベースを使用すると、Djangoが正常に実行されます。すべてのオブジェクトを取得し、フィールド、primayキーなどを問題なく使用します。

しかし、データベースへの書き込みに関しては、モデルに関係なく、全面的に同じエラーが発生します。

psycopg2.IntegrityError:列「id」のヌル値が非ヌル制約に違反しています

Herokuデータベースをリセットし、白紙の状態からオブジェクトを作成しても問題はありません。しかし、復元されたデータベースにオブジェクトを作成しようとすると、常にnull value in column "id" violates not-null constraint


Django Adminで基本モデルを作成しようとしたときのコピー/貼り付けスタックトレースを次に示します。作成に関連する追加コードがないため、このモデル例を選択しました。信号も何もありません。

Djangoバージョン:2.0 Pythonバージョン:3.6.3

トレースバック:

_execute 85の「/app/.heroku/python/lib/python3.6/site-packages/Django/db/backends/utils.py」ファイル。return self.cursor.execute(sql、params)

上記の例外(列 "id"のNULL値は非NULL制約に違反します。詳細:失敗する行には(null、特殊クラス、特殊クラス)が含まれます。)は、次の例外の直接の原因でした。

内側35のファイル「/app/.heroku/python/lib/python3.6/site-packages/Django/core/handlers/exception.py」。response = get_response(request)

_get_response 128のファイル「/app/.heroku/python/lib/python3.6/site-packages/Django/core/handlers/base.py」。response = self.process_exception_by_middleware(e、request)

_get_response 126の「/app/.heroku/python/lib/python3.6/site-packages/Django/core/handlers/base.py」ファイル。response = wrapped_callback(request、* callback_args、** callback_kwargs)

ラッパー574のファイル「/app/.heroku/python/lib/python3.6/site-packages/Django/contrib/admin/options.py」。return self.admin_site.admin_view(view)(* args、** kwargs )

_wrapped_view 142の「/app/.heroku/python/lib/python3.6/site-packages/Django/utils/decorators.py」ファイル。response = view_func(request、* args、** kwargs)

_wrapped_view_func 44のファイル「/app/.heroku/python/lib/python3.6/site-packages/Django/views/decorators/cache.py」。response = view_func(request、* args、** kwargs)

内部223のファイル「/app/.heroku/python/lib/python3.6/site-packages/Django/contrib/admin/sites.py」。returnview(request、* args、** kwargs)

Add_view 1553の「/app/.heroku/python/lib/python3.6/site-packages/Django/contrib/admin/options.py」ファイル。return self.changeform_view(request、None、form_url、extra_context)

_wrapper 62のファイル「/app/.heroku/python/lib/python3.6/site-packages/Django/utils/decorators.py」。return bound_func(* args、** kwargs)

_wrapped_view 142の「/app/.heroku/python/lib/python3.6/site-packages/Django/utils/decorators.py」ファイル。response = view_func(request、* args、** kwargs)

Bound_func 58の「/app/.heroku/python/lib/python3.6/site-packages/Django/utils/decorators.py」ファイル。return func。get(self、type(self))(* args2、** kwargs2)

Changeform_view 1450のファイル "/app/.heroku/python/lib/python3.6/site-packages/Django/contrib/admin/options.py"。return self._changeform_view(request、object_id、form_url、extra_context)

_changeform_view 1490のファイル「/app/.heroku/python/lib/python3.6/site-packages/Django/contrib/admin/options.py」。self.save_model(request、new_object、form、not add)

Save_model 1026のファイル「/app/.heroku/python/lib/python3.6/site-packages/Django/contrib/admin/options.py」。obj.save()

保存729のファイル「/app/.heroku/python/lib/python3.6/site-packages/Django/db/models/base.py」。force_update=force_update、update_fields=update_fields)

Save_base 759の「/app/.heroku/python/lib/python3.6/site-packages/Django/db/models/base.py」ファイル。updated = self._save_table(raw、cls、force_insert、force_update、using、 update_fields)

_save_table 842の「/app/.heroku/python/lib/python3.6/site-packages/Django/db/models/base.py」ファイル。result = self._do_insert(cls._base_manager、using、fields、update_pk、生)

_do_insert 880の「/app/.heroku/python/lib/python3.6/site-packages/Django/db/models/base.py」ファイル。using= using、raw = raw)

Manager_method 82の「/app/.heroku/python/lib/python3.6/site-packages/Django/db/models/manager.py」ファイル。return getattr(self.get_queryset()、name)(* args、* * kwargs)

_insert 1125のファイル「/app/.heroku/python/lib/python3.6/site-packages/Django/db/models/query.py」。return query.get_compiler(using = using).execute_sql(return_id)

Execute_sql 1280の「/app/.heroku/python/lib/python3.6/site-packages/Django/db/models/sql/compiler.py」ファイル。cursor.execute(sql、params)

実行100のファイル「/app/.heroku/python/lib/python3.6/site-packages/Django/db/backends/utils.py」。return super()。execute(sql、params)

実行68のファイル「/app/.heroku/python/lib/python3.6/site-packages/Django/db/backends/utils.py」。return self._execute_with_wrappers(sql、params、many = False、executor = self ._execute)

_execute_with_wrappers 77の「/app/.heroku/python/lib/python3.6/site-packages/Django/db/backends/utils.py」ファイル。return executor(sql、params、many、context)

_execute 85の「/app/.heroku/python/lib/python3.6/site-packages/Django/db/backends/utils.py」ファイル。return self.cursor.execute(sql、params)

ファイル「/app/.heroku/python/lib/python3.6/site-packages/Django/db/utils.py」のexit89。 exc_valueからdj_exc_value.with_traceback(traceback)を発生させます

_execute 85の「/app/.heroku/python/lib/python3.6/site-packages/Django/db/backends/utils.py」ファイル。return self.cursor.execute(sql、params)

例外タイプ:/ admin/fantasy/raceclass/add /のIntegrityError例外値:列「id」のnull値が非null制約に違反しています詳細:失敗した行には(null、Special Class、special-class)が含まれます。


スタックトレースからのモデル(このエラーは、この[非常に基本的な]モデルだけでなく、すべてのモデルに発生することに注意してください。)

class RaceClass(models.Model):
    title = models.CharField(max_length=140)
    slug = models.SlugField(unique=True)

    def __str__(self):
        return self.title

    class Meta:
        ordering = ['title']

次に、ローカルデータをherokuに復元(d)する方法を示します。

次のコマンドを使用して、ローカルのPostgresデータベース(バージョン10.0)をダンプしています。

PGPASSWORD=mypassword pg_dump -Fc --no-acl --no-owner -h localhost -U myuser mydb > mydb.dump

次に、AWSにアップロードし、次のコマンドを使用してHerokuのPostgresデータストア(バージョン9.6.5)に復元します。

heroku pg:backups:restore 'https://s3.amazonaws.com/me/items/3H0q/mydb.dump' DATABASE_URL

これらはどちらもHerokuドキュメントから直接のものです。 https://devcenter.heroku.com/articles/heroku-postgres-import-export


サイドノート:バージョン10.0のPostgresをローカルで使用しており、Heroku Datastoreは9.6.5です

20
taylor

これは、Postgres 10からエクスポートして9にインポートしているためだと確信しています。完全に失敗しているわけではありませんが、スキーマ定義の一部(この場合は自動インクリメントIDフィールド)は正しくインポートされていません。

私は2つのオプションを考えることができます:

  1. カスタム形式の代わりに生のSQLをダンプしてください:

    PGPASSWORD=mypassword pg_dump --no-acl --no-owner -h localhost -U myuser mydb > mydb.sql
    

    pg_restoreを使用してこれをロードすることはできません-代わりに、psqlを使用して手動でクエリを実行する必要があります。このような何かが動作するはずです:

    heroku pg:psql < mydb.sql
    

    ここでの注意点は、最初に既存のデータベースを空にする必要があるということです。

  2. これも失敗する場合は、インポートするPostgresの同じメジャーバージョンからエクスポートする必要があります。

13
solarissmoke

主なエラーは次のとおりです。

バージョン10.0のPostgresをローカルで使用しており、Heroku Datastoreは9.6.5です

それは起こるのを待っている問題です。私は両方で同じバージョンを使用しようとします。少なくとも同じメジャーバージョン。

特にこれら2つで思い浮かぶのは、標準SQLの導入です IDENTITYPostgres 10の列 =、主にシリアル列を置き換えるためのものです。テーブル定義を公開しなかったので、推測しかできません。 Postgres 10のIDENTITY機能は、Postgres 9.6に変換されず、エラーメッセージのNULL値の違反を非常にうまく説明できます。

関連:

6

私は最近同じ問題に直面していますが、ここに私のために働くものがあります:

  1. 新しいデータベースを作成する
  2. Django manage.pyを使用して、データベースのデータをダンプし、すべての移行を適用した後に新しいデータベースに復元します。

    python manage.py dumpdata --exclude auth.permission --exclude contenttypes --indent 2> db.json

  3. バックアップを復元する

    python manage.py loaddata db.json

0
salafi