2013-02-27 8 views
23

新しいユーザーテーブルをサイトに追加した後も、django_admin_logにはまだFH-auth_userテーブルがあります。これに対処する方法はありますか?ステージングやローカルでこの問題は見られなかったので、何か奇妙なことが起こったはずです。既存のサイトを新しいDjango 1.5ユーザーモデルに更新した後のdjango_admin_logの整合性エラー

トレースバック(最新の呼び出しの最後)

File "/app/.heroku/python/lib/python2.7/site-packages/django/core/handlers/base.py", line 115, in get_response response = callback(request, *callback_args, **callback_kwargs)

File "/app/.heroku/python/lib/python2.7/site-packages/newrelic-1.10.0.28/newrelic/api/object_wrapper.py", line 220, in call self._nr_instance, args, kwargs)

File "/app/.heroku/python/lib/python2.7/site-packages/newrelic-1.10.0.28/newrelic/hooks/framework_django.py", line 475, in wrapper return wrapped(*args, **kwargs)

File "/app/.heroku/python/lib/python2.7/site-packages/django/contrib/admin/options.py", line 372, in wrapper return self.admin_site.admin_view(view)(*args, **kwargs)

File "/app/.heroku/python/lib/python2.7/site-packages/django/utils/decorators.py", line 91, in _wrapped_view response = view_func(request, *args, **kwargs)

File "/app/.heroku/python/lib/python2.7/site-packages/django/views/decorators/cache.py", line 89, in _wrapped_view_func response = view_func(request, *args, **kwargs)

File "/app/.heroku/python/lib/python2.7/site-packages/django/contrib/admin/sites.py", line 202, in inner return view(request, *args, **kwargs)

File "/app/.heroku/python/lib/python2.7/site-packages/django/utils/decorators.py", line 25, in _wrapper return bound_func(*args, **kwargs)

File "/app/.heroku/python/lib/python2.7/site-packages/django/utils/decorators.py", line 91, in _wrapped_view response = view_func(request, *args, **kwargs)

File "/app/.heroku/python/lib/python2.7/site-packages/django/utils/decorators.py", line 21, in bound_func return func(self, *args2, **kwargs2)

File "/app/.heroku/python/lib/python2.7/site-packages/django/db/transaction.py", line 223, in inner return func(*args, **kwargs)

File "/app/.heroku/python/lib/python2.7/site-packages/django/db/transaction.py", line 217, in exit self.exiting(exc_value, self.using)

File "/app/.heroku/python/lib/python2.7/site-packages/django/db/transaction.py", line 281, in exiting commit(using=using)

File "/app/.heroku/python/lib/python2.7/site-packages/django/db/transaction.py", line 152, in commit connection.commit()

File "/app/.heroku/python/lib/python2.7/site-packages/django/db/backends/init.py", line 241, in commit self._commit()

File "/app/.heroku/python/lib/python2.7/site-packages/django/db/backends/postgresql_psycopg2/base.py", line 242, in _commit six.reraise(utils.IntegrityError, utils.IntegrityError(*tuple(e.args)), sys.exc_info()[2])

File "/app/.heroku/python/lib/python2.7/site-packages/django/db/backends/postgresql_psycopg2/base.py", line 240, in _commit return self.connection.commit()

File "/app/.heroku/python/lib/python2.7/site-packages/newrelic-1.10.0.28/newrelic/hooks/database_dbapi2.py", line 68, in commit return self._nr_connection.commit()

IntegrityError: insert or update on table "django_admin_log" violates foreign key constraint "django_admin_log_user_id_fkey" DETAIL: Key (user_id)=(2) is not present in table "auth_user".

答えて

18

django_admin_log表はまだ古いauth_userテーブルへの外部キー関係が含まれているからです。

これを削除してテーブルを再作成する必要があります。

ジャンゴ< 1.7

$ heroku run python manage.py syncdb 

とDjango> = 1.7

$ ./manage.py sqlmigrate admin 0001 | heroku pg:psql 

用については

$ heroku pg:psql 
psql => drop table django_admin_log; 

そして、それはそれだ:)

EDITED with @dustinfarris Django 1.7+ answer precision

0

あなたがこれを実行したときに、いくつかの点と悪い取引があったかもしれないかのように、あなたは完全にあなたのデシベルをリセットしてみてください可能性が表示されます:

heroku pg:reset 

それとも、データベースにPSQLと検討/(その2倍が同じユーザーを挿入しようとしている可能性がある)問題を作成thatsのデータを修正しようとする可能性があり:

heroku pg:psql 
0

私は管理者のアプリは、インストールすることを考えますdjango_admin_logテーブル。

python manage.py sqlclear admin 

BEGIN; 
DROP TABLE "django_admin_log"; 

COMMIT; 

でも試してみることもできます。

python manage.py sqlclear admin | python manage.py dbshell 
python manage.py syncdb 
30

あなたはこのに実行し、> = 1.7を使用している場合:

./manage.py dbshell 

DROP TABLE django_admin_log; 

、その後:

./manage.py sqlmigrate admin 0001 | ./manage.py dbshell 
+2

素晴らしいソリューション! –

+0

1.8.2を使用して私のために働いた。あなたが実際に何を追加した場合に最適でしょうか。 – Frankline

+0

'django 1.10.1'の新しいプロジェクトでは、言及したようにドロップを行いましたが、最後に' sqlimigrate'コマンドの代わりに、単純な 'migrate'コマンドを使用しました。だから、 "migrate-> error-> drop-> migrate"のようになりました。 – alxs

6

を後でDjangoの1.7または上にある場合は、適切なの追加私の意見では、django_admin_logテーブルを変更するための移行がはるかに良い選択肢です。そうすれば、実際に使用している可能性のある既存のログエントリを保持することができます。このような変更を行うには、idフィールドが同じであることが必要です。同じ名前などありますdjango_admin_logテーブル

./manage.py dbshell 

そして記述:

\d+ django_admin_log; 

これを

まずデータベース・シェルに行くことによって行うことができる制約の名前を、見つける必要があります出力には次のような制約があります。

"user_id_refs_id_c0d12874" FOREIGN KEY (user_id) REFERENCES my_custom_auth_model(id) DEFERRABLE INITIALLY DEFERRED 

ここで、my_custom_auth_modelは、カスタム認証モデルが存在するテーブルの名前です。user_id_refs_id_c0d12874は、制約の名前です(後でコピーする必要があります)。

次に、新しい移行作成:

./manage makemigrations --empty my_custom_auth_model 

を私が代わりにファイル名に日付スタンプの有益な何かを持っている私の新しい移動(すなわち0000_alter_admin_log_constraint.py)を改名しました。しかし4ゼロを使用しないでください、移行:)新しい移行で

を作成するときに割り当てられていたものは何でも使用することは、これは私が業務に使用されるものです:

operations = [ 
    migrations.RunSQL(
     '''ALTER TABLE django_admin_log DROP CONSTRAINT user_id_refs_id_c0d12874''', 
     reverse_sql='''ALTER TABLE django_admin_log ADD CONSTRAINT user_id_refs_id_c0d12874 
      FOREIGN KEY (user_id) REFERENCES auth_user(id) DEFERRABLE INITIALLY DEFERRED'''), 
    migrations.RunSQL(
     '''ALTER TABLE django_admin_log ADD CONSTRAINT user_id_refs_id_c0d12874 
      FOREIGN KEY (user_id) REFERENCES my_custom_auth_model(id) DEFERRABLE INITIALLY DEFERRED''', 
     reverse_sql='''ALTER TABLE django_admin_log DROP CONSTRAINT user_id_refs_id_c0d12874'''), 
] 

代替user_id_refs_id_c0d12874どんな制約の名前でコピーしました以前はご覧のとおり、2つの操作とその逆は相互に逆転しています。つまり、この移行を後方に移動することもできます。

は今、あなたがしなければならないすべては、新しい移行を適用することです:

./manage.py migrate 

django_admin_logテーブルが今再び使用可能にする必要があり、それへの書き込みを管理者に何かを代わりにIntegrityErrorで失敗の動作します。

+0

最も簡単な方法ではありませんが、少なくとも管理者のログにデータを保存してください! – mennanov

+0

マイグレーション時に制約名をハードコードするのは問題ないと思います。これは移植性がありません。おかげさまで –

+0

私はあまりにもマイグレーションファイルを持っていると感じています –

関連する問題