2011-09-09 3 views
12

첫째을, 여기 내 현재 설정입니다 :장고의 syncdb는 MySQL의 errno에 실패 : 150

장고 : 버전 1.3

의 MySQL : 버전 4.0.18 (나의 첫번째 선택 ...)

나는 그것이 이노 외국 키를 처리하는 방법을 함께 할 수있는 뭔가가 이해하는 바로는

Creating tables ... 
Creating table auth_permission 
Creating table auth_group_permissions 
Traceback (most recent call last): 
    File "C:\path_to_app\manage.py", line 14, in <module> 
    execute_manager(settings) 
    File "C:\Python27\lib\site-packages\django\core\management\__init__.py", line 438, in execute_manager 
    utility.execute() 
    File "C:\Python27\lib\site-packages\django\core\management\__init__.py", line 379, in execute 
    self.fetch_command(subcommand).run_from_argv(self.argv) 
    File "C:\Python27\lib\site-packages\django\core\management\base.py", line 191, in run_from_argv 
    self.execute(*args, **options.__dict__) 
    File "C:\Python27\lib\site-packages\django\core\management\base.py", line 220, in execute 
    output = self.handle(*args, **options) 
    File "C:\Python27\lib\site-packages\django\core\management\base.py", line 351, in handle 
    return self.handle_noargs(**options) 
    File "C:\Python27\lib\site-packages\django\core\management\commands\syncdb.py", line 101, in handle_noargs 
    cursor.execute(statement) 
    File "C:\Python27\lib\site-packages\django\db\backends\util.py", line 34, in execute 
    return self.cursor.execute(sql, params) 
    File "C:\Python27\lib\site-packages\django\db\backends\mysql\base.py", line 86, in execute 
    return self.cursor.execute(query, args) 
    File "C:\Python27\lib\site-packages\MySQLdb\cursors.py", line 174, in execute 
    self.errorhandler(self, exc, value) 
    File "C:\Python27\lib\site-packages\MySQLdb\connections.py", line 36, in defaulterrorhandler 
    raise errorclass, errorvalue 
_mysql_exceptions.OperationalError: (1005, "Can't create table '.\\database_name\\#sql-d64_e75f2.frm' (errno: 150)") 

: 나는 syncdb를 실행하면, 나는 다음과 같은 오류가 발생합니다.

"SET의 TABLE_TYPE = INNODB는"specfied되지
DATABASES = { 
    'default': { 
     .... 
     'OPTIONS': { 'init_command': 'SET table_type=INNODB;', 'charset': 'latin1'}, 
    }, 
} 

이 모든 것이 원활하게 실행 : 여기처럼 내 설정 파일이 어떻게 표시되는지를 보여줍니다. 나는 그물을 둘러 보았고 InnoDB 엔진이 뭔가를 좋아하지 않는다. the SQL Django is generating

현재로서는 내가 발견 한 유일한 문제는 테이블을 직접 만들고 inspectDB를 사용하여 모델을 생성하는 것이다. ..

수정 사항이 있습니까? 감사!

답변

0

문제의 원인을 추적했습니다. 외래 키 관계로 2 개의 InnoDB 테이블을 작성할 때는 외래 키 컬럼을 명시 적으로 색인화해야한다. prior to MySQL 4.1.2. Django의 ORM을 사용하면 외부 키 필드에 db_index=True 옵션을 사용하여이 작업을 수행 할 수 있습니다. 그러나 Django에서 SQL을 생성 할 때 외래 키 관계가 생성 된 후 CREATE INDEX 문이 발행됩니다. 예를 들어, 다음과 같은 모델 :

class Customer(models.Model): 
    first_name = models.CharField(max_length=100) 
    last_name = models.CharField(max_length=100) 

class Order(models.Model): 
    customer = models.ForeignKey(Customer, db_index=True) 

장고는 다음과 같은 SQL 코드를 생성

BEGIN; 
CREATE TABLE `foo_app_customer` (
    `id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, 
    `first_name` varchar(100) NOT NULL, 
    `last_name` varchar(100) NOT NULL 
) 
; 
CREATE TABLE `foo_app_order` (
    `id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, 
    `customer_id` integer NOT NULL 
) 
; 
ALTER TABLE `foo_app_order` ADD CONSTRAINT `customer_id_refs_id_27e4f922` FOREIGN KEY (`customer_id`) REFERENCES `foo_app_customer` (`id`); 
CREATE INDEX `foo_app_order_12366e04` ON `foo_app_order` (`customer_id`); 
COMMIT; 

당신이 노력이 ALTER TABLE을 실행할 때 발생합니다 MySQL은 4.0,의 errno (150)를 사용하여이 코드를 실행하려고하면 성명서. 그러나 CREATE INDEX 성명이 먼저 발행되면 모든 것이 매력처럼 작동합니다. 내가 말할 수있는 한,이 문제를 해결할 수있는 유일한 방법은 직접 테이블을 만들고 나중에 inspectdb을 사용하여 모델을 생성하는 것입니다.

또한 새로운 Django ticket을 만들었습니다.

+0

최소한의 방법으로 테이블을 수동으로 생성하려면 ['django-admin.py sql']의 출력을 복사하고 편집하십시오 (https://docs.djangoproject.com/en/dev/ref/django-admin/#sql- appname-appname) 명령을 사용하거나 ['django-admin.py customsql'] (https://docs.djangoproject.com/en/dev/ref/django-admin/#sqlcustom-appname-appname) 명령을 사용하십시오. –

4

MySQL의 docs이 말 : 여기

Cannot create table. If the error message refers to error 150, table creation failed because a foreign key constraint was not correctly formed. If the error message refers to error –1, table creation probably failed because the table includes a column name that matched the name of an internal InnoDB table.

포스트 모델 코드는 우리가 잘못 될 수 있는지 볼 수 있도록. 무엇이 잘못되었는지 알지 못한다면 저장소 개정을 양분하거나 응용 프로그램을 양분하십시오. 응용 프로그램의 절반을 끄고 올바르게 동기화되었는지 확인한 다음 잘못된 모델이 포함 된 부분을 양분합니다.

+0

답변 해 주셔서 감사합니다! 그러나 제 모델은 여기에서 문제를 일으키지 않습니다. 스택 추적에서 볼 수 있듯이 syncdb는 장고 인증 테이블을 만드는 동안 실패합니다. 가장 기본적인 모델의 경우에도 스크립트가 실패합니다. – RedsChineseFood

3

최근에이 오류가 발생했습니다. 필자의 경우 외래 키를 포함하는 테이블이 생성하려는 테이블과 다른 엔진을 사용하기 때문에이 오류가 발생했습니다. 이 문제를 해결하기 게으른 방법을 사용하여이 두 테이블 '엔진을 통합입니다 :

ALTER TABLE table_name ENGINE = engine_type; 

을 그리고 그것은 나를 위해 일했습니다.

+0

감사합니다. MySQL 5에서 저에게 도움이되었습니다. – leech

15

Django 1.5를 사용하는 경우 오류는 mysql이 Innodb를 기본 엔진으로 사용하여 테이블을 만드는 것입니다.해결 방법은 데이터베이스에 대한 설정에 다음을 추가하는 것이었고 제약 조건과 관련된 문제를 만들었습니다.

DATABASES = { 
'default': { 
    'ENGINE': 'django.db.backends.mysql', 
    'NAME': 'etc....', 
    'OPTIONS': { 
      "init_command": "SET storage_engine=MyISAM", 
    }, 
}, 

}