programing

테이블 생성 시 Django MySQL 오류

itmemos 2023. 9. 24. 12:22
반응형

테이블 생성 시 Django MySQL 오류

MySQL DB로 장고 앱을 만들고 있습니다.내가 '피톤'을 실행하면 관리합니다.py migration'은 처음으로 일부 테이블이 잘 생성된 후 오류가 나타납니다.발생한 오류는 다음과 같습니다.

장고 db utilIntegrityError: (1215, '외부 키 제약 조건 추가 불가')

이 MySQL 명령을 실행하면 -

SHOW 엔진 INNODB 상태\G,

알겠습니다 >>>

2015-02-17 14:33:17 7f10891cf700 Error in foreign key constraint of table movie_store/#sql-4f1_66:
 FOREIGN KEY (`group_id`) REFERENCES `auth_group` (`id`):
Cannot resolve table name close to:
 (`id`)

전체 추적은 다음과 같습니다.

Creating tables...
    Creating table users
    Creating table merchant
    Creating table celery_taskmeta
    Creating table celery_tasksetmeta
    Creating table djcelery_intervalschedule
    Creating table djcelery_crontabschedule
    Creating table djcelery_periodictasks
    Creating table djcelery_periodictask
    Creating table djcelery_workerstate
    Creating table djcelery_taskstate
    Creating table post_office_email
    Creating table post_office_log
    Creating table post_office_emailtemplate
    Creating table post_office_attachment
    Running deferred SQL...
Traceback (most recent call last):
  File "manage.py", line 10, in <module>
    execute_from_command_line(sys.argv)
  File "/usr/local/lib/python2.7/dist-packages/django/core/management/__init__.py", line 338, in execute_from_command_line
    utility.execute()
  File "/usr/local/lib/python2.7/dist-packages/django/core/management/__init__.py", line 330, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/usr/local/lib/python2.7/dist-packages/django/core/management/base.py", line 390, in run_from_argv
    self.execute(*args, **cmd_options)
  File "/usr/local/lib/python2.7/dist-packages/django/core/management/base.py", line 441, in execute
    output = self.handle(*args, **options)
  File "/usr/local/lib/python2.7/dist-packages/django/core/management/commands/migrate.py", line 173, in handle
    created_models = self.sync_apps(connection, executor.loader.unmigrated_apps)
  File "/usr/local/lib/python2.7/dist-packages/django/core/management/commands/migrate.py", line 309, in sync_apps
    cursor.execute(statement)
  File "/usr/local/lib/python2.7/dist-packages/django/db/backends/utils.py", line 80, in execute
    return super(CursorDebugWrapper, self).execute(sql, params)
  File "/usr/local/lib/python2.7/dist-packages/django/db/backends/utils.py", line 65, in execute
    return self.cursor.execute(sql, params)
  File "/usr/local/lib/python2.7/dist-packages/django/db/utils.py", line 95, in __exit__
    six.reraise(dj_exc_type, dj_exc_value, traceback)
  File "/usr/local/lib/python2.7/dist-packages/django/db/backends/utils.py", line 63, in execute
    return self.cursor.execute(sql)
  File "/usr/local/lib/python2.7/dist-packages/django/db/backends/mysql/base.py", line 124, in execute
    return self.cursor.execute(query, args)
  File "/usr/lib/python2.7/dist-packages/MySQLdb/cursors.py", line 174, in execute
    self.errorhandler(self, exc, value)
  File "/usr/lib/python2.7/dist-packages/MySQLdb/connections.py", line 36, in defaulterrorhandler
    raise errorclass, errorvalue
django.db.utils.IntegrityError: (1215, 'Cannot add foreign key constraint')

이 방법으로 작동합니다.

python manage.py migrate auth
python manage.py migrate

다른 마이그레이션으로 인한 문제는 authtools의 마이그레이션이 먼저 실행됩니다.

다음을 사용하는 동안 이 문제가 발생했습니다.

$ python manage.py test

해당 모델에 대해 마이그레이션을 수행하지 않은 경우, 장고.contrib에 대한 Foreign key인 필드가 있습니다.저자. models사용자, 그러면 문제가 발생합니다.

활성화한 --keepdb당신은 없다는 것을 알게 될 것입니다.auth_user테이블과 다른 장고의 관리 테이블.


전체 문제를 추적해 보겠습니다.

실행:

$ python manage.py test --verbosity=3

다음에 제기된 외국인 gkey 제약 조건 예외를 확인할 수 있습니다.

지연 SQL 실행 중...

연기된 sql은 다음과 비슷합니다.

변경 ""xxx 조건 dxx키(x ) auth_user"

django/core/management/ commands/ migrate의 source code를 확인합니다.py:

for statement in deferred_sql:
    cursor.execute(statement)

defered_sqlmmanifest.items()루프의 경우,

그리고.manifestmall_models,

그리고.all_models는 app_labels의 app_config.label에서 가져온 것입니다.

이것은 지나온 논쟁입니다.

self.sync_apps(connection, executor.loader.unmigrated_apps)

,executor.loader.unmigrated_apps마이그레이션되지 않은_app의 레이블이 포함되며, 우연히 Django의 auth_user에 대한 외국인 키가 있으면 외국인 키 제약이 발생합니다. 당시 오류 원인으로 auth_user라는 이름의 테이블이 없습니다.


솔루션:

해 보다app은 Foreignkey Attributes입니다.

$ python manage.py migrate auth
$ python manage.py migrate
$ python manage.py makemigrations app

이 있다면 , ,app가 , 합니다와 하다고 가정합니다.app모듈, 다음이 필요합니다.

$ python manage.py make migrate app --fake

모든 애플리케이션에 대해 마이그레이션을 생성했습니까?그렇지 않은 경우 데이터베이스 테이블이 잘못된 순서로 생성되고 있다는 문제가 발생할 수 있으며 이 오류가 발생합니다.

기존 Django 1.7 프로젝트가 있는 경우, 여기 설명된 대로 초기 마이그레이션 파일을 생성한 다음 초기 마이그레이션을 위장해야 합니다.

https://docs.djangoproject.com/en/1.8/topics/migrations/ # adding - migr 사항 -

다음을 사용하여 마이그레이션 생성

$ python manage.py make migrations your_app_label

그리고는 그 애플리케이션을 가짜로 만들어 버립니다.

$  python manage.py migrate --fake-initial your_app_label

외국키 'author_id' 에 대해서도 같은 문제가 있었습니다.

해결책은 이름을 바꾸는 것이었습니다.

author = models.ForeignKey(User, related_name='+')

로.

writer = models.ForeignKey(User, related_name='+')

그래서 당신의 필드 이름을 다른 것으로 바꾸려고 노력해보세요.

group

BitBucket/Pipeline에서 CI를 설정하는 과정에서 동일한 오류가 발생하였습니다.문제는 제가 마이그레이션 폴더를 git 저장소에 커밋하지 않았다는 것입니다. Pipeline이 모든 것을 처음부터 다시 빌드하기 때문에 단위 테스트가 시작되지 않았기 때문입니다.

마이그레이션 폴더는 다음을 실행할 때 생성됩니다.

python manage.py makemigrations
python manage.py makemigrations <module_name>

테스트는 make migration/migration 단계를 실행하고 비테스트 코드가 작동하는지 확인한 후에 작동합니다.

다음과 같습니다.

python manage.py test 

마이그레이션이 현재 존재하지 않는 경우 마이그레이션을 생성하려고 하지만 항상 종속성을 올바르게 가져올 수는 없으므로 마이그레이션 폴더의 자동 생성 코드를 소스 코드 저장소에 커밋해야 합니다.

장고 마이그레이션에 대한 자세한 내용은 https://docs.djangoproject.com/en/1.11/topics/migrations/ 에서 확인할 수 있습니다.

외부 키와 기본 키가 모두 같은 유형인지 확인합니다.

외래 키는 외래 테이블의 기본 키와 동일한 종류여야 합니다.나는 외국 테이블에 빅 인트를 가지고 있었고 장고는 자동으로 빅 인트인 외국 키를 만드는 방법을 몰랐습니다.

다음을 실행하여 마이그레이션에 실패한 이유 조사: python manage.py sqlmigrate {app_name} { migration_name}

이 작업을 작업대에서 실행하면 장애의 진짜 오류가 나타납니다.

장고 db utilIntegrityError: (1215, '외부 키 제약 조건 추가 불가')

MySQL 데이터베이스에 대해 Django 라이브러리에서 테스트를 실행하는 동안 유사한 문제가 발생했습니다(CentOS 7과의 Django 2.2 호환성을 방지하기 위해).이는 문제 carton.swing의 답변 주소와 유사하지만 문제를 해결하기 위해 다른 접근 방식을 사용합니다.

테스트하려는 라이브러리에 대한 몇 가지 참고 사항:

  • 라이브러리에는 모델이 정의되어 있지 않지만 테스트 제품군은 테스트 목적으로 모델을 정의합니다.
  • 테스트 스위트는 정의하지 않은 모델에 대한 외국 에 의존합니다.auth.User모형을 보다

오래된 장고표를 조사한 결과, 다음과 같은 반응이 나타났습니다.

문제는 마이그레이션되지 않은 앱(authtoken)이 마이그레이션된 앱(메인)에 의존(FK가 있음)한다는 것입니다.이것은 잘 알려진 노노입니다.

(저는 이것이 "잘 알려진 노노"라는 것에 대한 다른 언급을 찾을 수 없었습니다.)테스트 스위트는 일부 모델을 정의하고 있으며, 또한 다음을 사용하기 때문에auth.UserDjango가 제공한 테스트 런너(pytest, 이 경우) 테스트 제품군에 정의되었지만 마이그레이션되지 않은 모델auth.User. 이를 테스트하기 위해 테스트 제품군에서 마이그레이션을 해제했습니다(pytest-django의 경우 플래그만 추가하면 됨).

그와 비슷한 상황에 처했고, 그로 인해

django.db.utils.OperationalError: (1824, "Failed to open the referenced table 'auth_user'")

처음에는 모든 마이그레이션을 제대로 수행했는지 확인함으로써 해결했습니다. 모든 앱에는 해당 마이그레이션 폴더가 있고 또한__init__.py그 안에 파일을 저장합니다.

그 후 데이터베이스에 있는 다른 테이블에서도 비슷한 문제가 발생하여 또 다른 오류가 발생하여 테스트를 시작할 수 없게 되었습니다.저는 django_migration 테이블의 모든 레코드를 제거하고, migration 파일을 모두 삭제하여 해결했습니다(괜찮으시면).그 다음엔 내가 달립니다.

python manage.py makemigrations

python manage.py migrate --fake

이주자들이 다루는 모든 헛소리들 :)

같은 문제가 있었는데, 알고 보니 장고는 어떻게 해서든 업그레이드가 되었습니다.v1.8, 즉시 로 격하된v1.7일했다.

장고에서 syncdb manage 대신 1.8 syncdb 명령어가 제거되었습니다.py migrate 명령을 실행하면 테이블이 생성됩니다. 그 후에는 superuser use superuser creating 명령을 사용하거나 manage를 실행해야 합니다.py syncdb, 잘 될 겁니다.

위가 작동하지 않고 Innodb가 필요 없는 경우 MYISAM에 기본값을 지정하면 동일한 수준의 참조 무결성이 없기 때문에 작동합니다.

DATABASES = { 
  'default': {
    'ENGINE': 'django.db.backends.mysql',
    'NAME': 'name',                      
    'USER': 'user',     
    'PASSWORD': 'password',
    'OPTIONS': {
           "init_command": "SET storage_engine=MYISAM",
    }   
  }   
}

언급URL : https://stackoverflow.com/questions/28561458/django-mysql-error-when-creating-tables

반응형