공식 Django 문서 의 첫 번째 앱 자습서 를 따르고 있었는데 관리자 페이지를 통해 변경 한 내용을 저장하려고 할 때이 오류가 발생했습니다. 나는 그것에 대해 약간의 조사를했지만 db 마이그레이션과 같은 가능한 해결책은 작동하지 않습니다. 내 코드의 특정 부분을보고 싶다면 알려주세요.
다음은 오류입니다.
OperationalError at / admin / polls / question / 1 / change / no such table : main.auth_user__old Request Method : POST Request 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, line 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 ‘] 서버 시간 : Wed, 5 Dec 2018 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)
파일 “/Users/gfioravante/Projects/test_app/ta_env/lib/python3.7/site-packages/django/db/backends/sqlite3/base.py”실행 296. return Database.Cursor.execute (self, query, 매개 변수)
위의 예외 (해당 테이블 없음 : 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 = Wrap_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)
파일 “/Users/gfioravante/Projects/test_app/ta_env/lib/python3.7/site-packages/django/utils/decorators.py”in _wrapped_view 142. 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)
파일 “/Users/gfioravante/Projects/test_app/ta_env/lib/python3.7/site-packages/django/utils/decorators.py”in _wrapped_view 142. response = view_func (request, * args, ** kwargs)
changeform_view 1525의 “/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)
_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) (* 인수, ** kwargs)
create 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 )
save 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)
save_base 748의 “/Users/gfioravante/Projects/test_app/ta_env/lib/python3.7/site-packages/django/db/models/base.py”파일. updated = self._save_table (raw, cls, force_insert, force_update , 사용, 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, 원시)
파일 “/Users/gfioravante/Projects/test_app/ta_env/lib/python3.7/site-packages/django/db/models/base.py”in _do_insert 869. 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) (* 인수, ** 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)
execute 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)
파일 “/Users/gfioravante/Projects/test_app/ta_env/lib/python3.7/site-packages/django/db/backends/utils.py”in _execute_with_wrappers 77. 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)
89 번 출구의 “/Users/gfioravante/Projects/test_app/ta_env/lib/python3.7/site-packages/django/db/utils.py”파일. exc_value에서 dj_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)
파일 “/Users/gfioravante/Projects/test_app/ta_env/lib/python3.7/site-packages/django/db/backends/sqlite3/base.py”실행 296. return Database.Cursor.execute (self, query, 매개 변수)
예외 유형 : OperationalError at / admin / polls / question / 1 / change / 예외 값 : 해당 테이블 없음 : main.auth_user__old
답변
나는 방금 이것을 발견했으며 https://code.djangoproject.com/ticket/29182 와 관련이있는 것 같습니다 . 지금은 sqlite 버전을 2.6 이전 버전 (예 : 2.5.1)으로 다운 그레이드 할 수 있습니다.
답변
다음 단계를 유지하여이 문제를 쉽게 제거하십시오.
- django 버전 2.1.5 유지 (이 버전에서 해결 된 문제)
pip install django==2.1.5
- SQLite db 삭제
- 다시 마이그레이션
python manage.py makemigrations
한 다음python manage.py migrate
- 서버 시작
python manage.py runserver
끝난!
답변
방금 이렇게했고 문제가 해결되었습니다.
pip install Django --upgrade
그때:
python manage.py migrate
python manage.py makemigrations app
python manage.py migrate
답변
이 문제는 ALTER TABLE RENAME
SQLite 3.26.0 의 수정 된 동작으로 인해 발생합니다 ( 호환성 참고 사항 참조 ). 또한 PRAGMA legacy_alter_table = ON
이전 버전과의 호환성을 유지하기 위해 성명서를 도입했습니다 . 곧 출시 될 Django 릴리스 2.1.5 는 이전에 언급 한 설명을 핫픽스로 활용합니다. 2019 년 1 월 1 일에 예정되어 있습니다.
답변
이 문제를 해결하기 위해 내가 한 일은 다음과 같습니다.
-
가상 환경으로 이동하여 설치
django@2.1.7
pip install django==2.1.7
-
db.sqlite3
루트 폴더에서 파일을 삭제하십시오 . db.sqlite3
루트 폴더에 새 파일 을 만듭니다 .-
마이그레이션을 다시 실행하십시오.
python3 manage.py makemigrations python3 manage.py migrate
이제 제대로 작동합니다.
답변
이 폴더로 이동 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)
더 많은 정보를 위해서
답변
Django를 2.1.4에서 2.1.5로 업그레이드하여 문제를 해결했지만 버그가 이전 버전의 Django를 사용하여 데이터베이스에 삽입 한 개체와 관련이있는 것 같아서 프로젝트를 새로 다시 빌드해야했습니다.