私は公式のDjangoドキュメントから 最初のアプリチュートリアル をフォローしていましたが、管理ページで行った変更を保存しようとするとこのエラーが発生しました。私はそれについていくつかの研究を行いましたが、dbの移行など、私が見つけることができた可能な解決策は、単に機能しません。あなたが私のコードの特定の部分を見たいかどうか私に知らせてください。
エラーは次のとおりです。
/ admin/polls/question/1/change /のOperationalErrorそのようなテーブルはありません:main.auth_user__old要求メソッド:POST要求URL: http://127.0.0.1:8000/admin/polls/question/1/change / Djangoバージョン:2.1.4例外タイプ:OperationalError例外値:そのようなテーブルはありません:main.auth_user__old例外ロケーション:/ Users/gfioravante/Projects/test_app/ta_env/lib/python3.7/site-packages/Django/db/backends/sqlite3/base.py in execute、行296 Python実行可能ファイル:/ Users/gfioravante/Projects/test_app/ta_env/bin/python3 Pythonバージョン:3.7.1 Pythonパス:
['/ Users/gfioravante/Projects/test_app/test_app'、 '/usr/local/Cellar/python/3.7.1/Frameworks/Python.framework/Versions/3.7/lib/python37.Zip'、 '/usr/local/Cellar/python/3.7.1/Frameworks/Python.framework/Versions/3.7/lib/python3.7'、'/usr/local/Cellar/python/3.7.1/Frameworks/Python.framework /Versions/3.7/lib/python3.7/lib-dynload '、' /Users/gfioravante/Projects/test_app/ta_env/lib/python3.7/site-packages ']サーバー時間:2018年12月5日水曜日16:45 :00 +0000
そしてトレースバック:
環境:
リクエスト方法:POSTリクエストURL: http://127.0.0.1:8000/admin/polls/question/1/change/
Djangoバージョン:2.1.4 Pythonバージョン:3.7.1インストール済みアプリケーション:['polls.apps.PollsConfig'、 'Django.contrib.admin'、 'Django.contrib.auth'、 'Django.contrib .contenttypes '、' Django.contrib.sessions '、' Django.contrib.messages '、' Django.contrib.staticfiles ']インストール済みミドルウェア:[' Django.middleware.security.SecurityMiddleware '、' Django.contrib.sessions.middleware .SessionMiddleware」、「Django.middleware.common.CommonMiddleware」、「Django.middleware.csrf.CsrfViewMiddleware」、「Django.contrib.auth.middleware.AuthenticationMiddleware」、「Django.contrib.messages.middleware.MessageMiddleware」、「Django .middleware.clickjacking.XFrameOptionsMiddleware ']
トレースバック:
_execute 85の「/Users/gfioravante/Projects/test_app/ta_env/lib/python3.7/site-packages/Django/db/backends/utils.py」ファイル。return self.cursor.execute(sql、params)
実行296のファイル「/Users/gfioravante/Projects/test_app/ta_env/lib/python3.7/site-packages/Django/db/backends/sqlite3/base.py」。returnDatabase.Cursor.execute(self、query、 params)
上記の例外(このようなテーブルはありません:main.auth_user__old)は、次の例外の直接の原因でした:
内側34のファイル「/Users/gfioravante/Projects/test_app/ta_env/lib/python3.7/site-packages/Django/core/handlers/exception.py」。response= get_response(request)
_get_response 126のファイル「/Users/gfioravante/Projects/test_app/ta_env/lib/python3.7/site-packages/Django/core/handlers/base.py」。response = self.process_exception_by_middleware(e、request)
_get_response 124のファイル「/Users/gfioravante/Projects/test_app/ta_env/lib/python3.7/site-packages/Django/core/handlers/base.py」。response = wrapped_callback(request、* callback_args、** callback_kwargs)
ラッパー604の「/Users/gfioravante/Projects/test_app/ta_env/lib/python3.7/site-packages/Django/contrib/admin/options.py」ファイル。return self.admin_site.admin_view(view)(* args、 ** kwargs)
_wrapped_view 142のファイル「/Users/gfioravante/Projects/test_app/ta_env/lib/python3.7/site-packages/Django/utils/decorators.py」。response = view_func(request、* args、** kwargs)
_wrapped_view_func 44のファイル「/Users/gfioravante/Projects/test_app/ta_env/lib/python3.7/site-packages/Django/views/decorators/cache.py」。response = view_func(request、* args、** kwargs)
内部223のファイル「/Users/gfioravante/Projects/test_app/ta_env/lib/python3.7/site-packages/Django/contrib/admin/sites.py」に戻ります。return view(request、* args、** kwargs)
Change_view 1640の「/Users/gfioravante/Projects/test_app/ta_env/lib/python3.7/site-packages/Django/contrib/admin/options.py」ファイル。return self.changeform_view(request、object_id、form_url、extra_context)
_wrapper 45の「/Users/gfioravante/Projects/test_app/ta_env/lib/python3.7/site-packages/Django/utils/decorators.py」ファイル。return bound_method(* args、** kwargs)
_wrapped_view 142のファイル「/Users/gfioravante/Projects/test_app/ta_env/lib/python3.7/site-packages/Django/utils/decorators.py」。response = view_func(request、* args、** kwargs)
ファイル "/Users/gfioravante/Projects/test_app/ta_env/lib/python3.7/site-packages/Django/contrib/admin/options.py"のchangeform_view 1525にある。return self._changeform_view(request、object_id、form_url、extra_context)
_changeform_view 1571のファイル「/Users/gfioravante/Projects/test_app/ta_env/lib/python3.7/site-packages/Django/contrib/admin/options.py」。self.log_change(request、new_object、change_message)
Log_change 826の「/Users/gfioravante/Projects/test_app/ta_env/lib/python3.7/site-packages/Django/contrib/admin/options.py」ファイル。change_message= message、
Log_action 35の「/Users/gfioravante/Projects/test_app/ta_env/lib/python3.7/site-packages/Django/contrib/admin/models.py」ファイル。change_message= change_message、
Manager_method 82のファイル「/Users/gfioravante/Projects/test_app/ta_env/lib/python3.7/site-packages/Django/db/models/manager.py」。return getattr(self.get_queryset()、name)(* args、** kwargs)
作成413のファイル「/Users/gfioravante/Projects/test_app/ta_env/lib/python3.7/site-packages/Django/db/models/query.py」。obj.save(force_insert=True、using = self.db )
保存718のファイル「/Users/gfioravante/Projects/test_app/ta_env/lib/python3.7/site-packages/Django/db/models/base.py」。force_update=force_update、update_fields = update_fields)
ファイル「/Users/gfioravante/Projects/test_app/ta_env/lib/python3.7/site-packages/Django/db/models/base.py」のsave_base 748にあります。updated = self._save_table(raw、cls、force_insert、force_insert 、使用、update_fields)
_save_table 831のファイル「/Users/gfioravante/Projects/test_app/ta_env/lib/python3.7/site-packages/Django/db/models/base.py」。result = self._do_insert(cls._base_manager、using、fields 、update_pk、raw)
_do_insert 869のファイル「/Users/gfioravante/Projects/test_app/ta_env/lib/python3.7/site-packages/Django/db/models/base.py」を使用します。using= using、raw = raw)
Manager_method 82のファイル「/Users/gfioravante/Projects/test_app/ta_env/lib/python3.7/site-packages/Django/db/models/manager.py」。return getattr(self.get_queryset()、name)(* args、** kwargs)
_insert 1136の「/Users/gfioravante/Projects/test_app/ta_env/lib/python3.7/site-packages/Django/db/models/query.py」ファイル。return query.get_compiler(using = using).execute_sql(return_id )
Execute_sql 1289の「/Users/gfioravante/Projects/test_app/ta_env/lib/python3.7/site-packages/Django/db/models/sql/compiler.py」ファイル。cursor.execute(sql、params)
ファイル「/Users/gfioravante/Projects/test_app/ta_env/lib/python3.7/site-packages/Django/db/backends/utils.py」の実行100。return super()。execute(sql、params)
実行68の「/Users/gfioravante/Projects/test_app/ta_env/lib/python3.7/site-packages/Django/db/backends/utils.py」ファイル。return self._execute_with_wrappers(sql、params、many = False、 executor = self._execute)
_execute_with_wrappers 77の「/Users/gfioravante/Projects/test_app/ta_env/lib/python3.7/site-packages/Django/db/backends/utils.py」ファイル。return executor(sql、params、many、context)
_execute 85の「/Users/gfioravante/Projects/test_app/ta_env/lib/python3.7/site-packages/Django/db/backends/utils.py」ファイル。return self.cursor.execute(sql、params)
ファイル「/Users/gfioravante/Projects/test_app/ta_env/lib/python3.7/site-packages/Django/db/utils.py」のexit89. raise dj_exc_value。 exc_valueからのwith_traceback(traceback)
_execute 85の「/Users/gfioravante/Projects/test_app/ta_env/lib/python3.7/site-packages/Django/db/backends/utils.py」ファイル。return self.cursor.execute(sql、params)
実行296のファイル「/Users/gfioravante/Projects/test_app/ta_env/lib/python3.7/site-packages/Django/db/backends/sqlite3/base.py」。returnDatabase.Cursor.execute(self、query、 params)
例外タイプ:/ admin/polls/question/1/change /のOperationalError例外値:そのようなテーブルはありません:main.auth_user__old
私はこれに出くわしたばかりで、 https://code.djangoproject.com/ticket/29182 に関連しているようです。現時点では、sqliteのバージョンを2.6より前のバージョン(2.5.1など)にダウングレードできます。
この問題は、SQLite 3.26.0のALTER TABLE RENAME
ステートメントの動作が変更されたために発生します( 互換性に関する注意 を参照)。また、以前のバージョンとの互換性を維持するためにPRAGMA legacy_alter_table = ON
ステートメントを導入しました。今後の Djangoリリース2.1.5 では、前述のステートメントを修正プログラムとして利用します。 2019年1月1日に予定されています。
このフォルダーに移動しますDjango/db/backends/sqlite3
'schema.py'ファイルを別のフォルダーにバックアップする
テキストエディタで元のschema.pyを開きます
そこにあなたは次のようなコードスニペットを見ることができます
def __enter__(self):
# Some SQLite schema alterations need foreign key constraints to be
# disabled. Enforce it here for the duration of the schema edition.
if not self.connection.disable_constraint_checking():
raise NotSupportedError(
'SQLite schema editor cannot be used while foreign key '
'constraint checks are enabled. Make sure to disable them '
'before entering a transaction.atomic() context because '
'SQLite3 does not support disabling them in the middle of '
'a multi-statement transaction.'
)
self.connection.cursor().execute('PRAGMA legacy_alter_table = ON')
return super().__enter__()
それらをコメントし、次のコードスニペットを貼り付けます
def __enter__(self):
# Some SQLite schema alterations need foreign key constraints to be
# disabled. Enforce it here for the duration of the transaction.
self.connection.disable_constraint_checking()
self.connection.cursor().execute('PRAGMA legacy_alter_table = ON')
return super().__enter__()
これは私のために働いた。 (schema.pyのバックアップは、作業がうまくいかない場合のためです; D)
詳細については
ありがとうございました
私にも同じことが起こり、とてもイライラします。環境にanacondaを使用していますが、最新バージョンのsqliteをすぐに再インストールしないとsqliteを削除できないことがわかりました。古いバージョンのDjangoを試してもうまくいかないようです。私のために働いた唯一の解決策は、PostgreSQLデータベースを使用することです。確かに理想的ではありませんが、将来PostgreSQLデータベースを利用することを計画しているため、これは完全な時間の無駄ではありませんでした。私と同じ場所にいることに気づいたら、PostgreSQLデータベースをDjangoプロジェクトに接続する方法を知りたい場合は、この video が役立つかもしれません。
Settings.pyで実際に変更を行う前にpostgreSQLデータベースをインストールする必要があります。インストールは、すべてのオプションで[次へ]をクリックするだけです。ただし、インストール時に使用するユーザー名とパスワードを覚えておいてください。
Djangoを2.1.4から2.1.5にアップグレードすることで問題を解決しましたが、古いバージョンのDjangoを使用してデータベースに挿入したオブジェクトに関連していると思われるため、プロジェクトを新たに再構築する必要がありました。
できることは、単にsqlite3ブラウザーを使用してデータベースに移動し、それぞれの属性を使用して参照テーブルをauth_user__oldからauth_userに変更するだけです。私にとってはうまくいき、私のプロジェクトはうまく機能しています。
djangoのバージョンを変更したくない場合は、データベースを変更する必要があります。 PostgreSQLの推奨事項を使用してください。問題は、移行後の移行と移行です。
次の手順を維持して、この問題を簡単に取り除きます。
pip install Django==2.1.5
python manage.py makemigrations
を再度移行してから、python manage.py migrate
を移行しますpython manage.py runserver
完了!
Djangoバージョンを1.5にダウングレードするか、バージョンをダウングレードしたくない場合は、ローカルで schema.py を変更し、パッチを適用してmakemigrations + migrateコマンドを実行できますが、推奨されません。
2つのsqliteデータベースとカスタムデータベースルーターがあったことを除いて、同じ問題がありました。 Djangoを1.11.20にダウングレードすることで、データベースを再作成する必要がなく、機能するようになりました。
ソフトウェアをダウングレードしたくない人は、settings.py
ファイルに移動し、DATABASES
dictで、.sqlit3
を.postgresql
に置き換え、そのすぐ下でdb.sqlit3
をdb.sql
に変更します。これにより、デフォルトのデータベースがpostgreSQLを使用するように切り替わります。
そのためには、pip install psycopg2
が必要です。
db.sqlite3
ファイルを削除します(ファイルがある場合/中身を失うことを気にしない場合)およびアプリの移行フォルダーにある__init__.py
ファイル以外のすべてを削除します。すべてを完了したら、python manage.py makemigrations
とpython manage.py migrate
を実行できます。
私は誰かを助けることができたと思います!
Djangoの最新バージョンを使用して問題を解決しようとしましたが、問題はまだ残っています。 DjangoとSqlite3でこの問題をデバッグしないときまでは、Djangoの古いバージョンを使用しています。バージョン1.10.5を使用することを検討してください(コマンドpip install --upgrade Django == 1.10.5を使用)
上記の回答でこのエラーを解決できない場合、「main」という名前でアプリを作成した場合、このエラーは同じアプリ名の問題の原因になる可能性があります。そのため、アプリ名「main」を別の名前に変更してみてください。
手順:
ENVから現在のDjangoをアンインストールします。フォルダー「anaconda3/envs/yourenv/lib/python3.7/site-packages/Django全バージョンを削除するだけです。*注:Anacondaユーザーの場合のみ、他のユーザーはENVからパッケージをアンインストールする方法を理解する必要があります。
Github.com/Django/djangoにアクセスします。
リポジトリをZipファイルとしてダウンロードします。
Zipを抽出します。
ENVに切り替えます。
解凍したフォルダーを入力します。
「python setup.py install」を実行し、Djangoをインストールします。
以前のdb.sqlite3ファイルを削除します。次に、移行を再度適用して、新しいdb.sqlite3ファイルを作成します。
*注意:以前のdbfileを修正してデータの損失を防ぐ方法はわかりません。知っているなら教えてください。
おめでとうございます!現在は正常に動作しています。
Djangoの公式リリースから1月に最新のDjangoにアップデートしてください。