私が持っているローカル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です
これは、Postgres 10からエクスポートして9にインポートしているためだと確信しています。完全に失敗しているわけではありませんが、スキーマ定義の一部(この場合は自動インクリメントIDフィールド)は正しくインポートされていません。
私は2つのオプションを考えることができます:
カスタム形式の代わりに生のSQLをダンプしてください:
PGPASSWORD=mypassword pg_dump --no-acl --no-owner -h localhost -U myuser mydb > mydb.sql
pg_restore
を使用してこれをロードすることはできません-代わりに、psql
を使用して手動でクエリを実行する必要があります。このような何かが動作するはずです:
heroku pg:psql < mydb.sql
ここでの注意点は、最初に既存のデータベースを空にする必要があるということです。
これも失敗する場合は、インポートするPostgresの同じメジャーバージョンからエクスポートする必要があります。
主なエラーは次のとおりです。
バージョン10.0のPostgresをローカルで使用しており、Heroku Datastoreは9.6.5です
それは起こるのを待っている問題です。私は両方で同じバージョンを使用しようとします。少なくとも同じメジャーバージョン。
特にこれら2つで思い浮かぶのは、標準SQLの導入です IDENTITY
Postgres 10の列 =、主にシリアル列を置き換えるためのものです。テーブル定義を公開しなかったので、推測しかできません。 Postgres 10のIDENTITY
機能は、Postgres 9.6に変換されず、エラーメッセージのNULL値の違反を非常にうまく説明できます。
関連:
私は最近同じ問題に直面していますが、ここに私のために働くものがあります:
Django manage.pyを使用して、データベースのデータをダンプし、すべての移行を適用した後に新しいデータベースに復元します。
python manage.py dumpdata --exclude auth.permission --exclude contenttypes --indent 2> db.json
バックアップを復元する
python manage.py loaddata db.json