2011-09-09 15 views
12

İlk kapalı, burada benim şimdiki Kurulum:Django'nın syncdb MySQL hatanum ile başarısız: 150

Django: sürüm 1.3

MySQL: sürüm 4.0.18 (değil 1 seçimim ...)

bunun InnoDB yabancı anahtarlar nasıl işleyeceğini ile bir ilgisi vardır anladığım

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)") 

: Ben syncdb çalıştırdığınızda, aşağıdaki hatayı alıyorum.

"SET table_type = InnoDB" Belirttiğiniz değil
DATABASES = { 
    'default': { 
     .... 
     'OPTIONS': { 'init_command': 'SET table_type=INNODB;', 'charset': 'latin1'}, 
    }, 
} 

, her şey sorunsuz çalışır: Burada gibi benim ayar dosyası görünüyor budur. Ben net baktım ve InnoDB motoru hakkında bir şey beğenmediği görünüyor InnoDB motoru hakkında bir şey hoşuna gitmiş gibi görünüyor Ben şu anda, benim tek tabloları oluşturmak ve inspectDB kullanarak modelleri oluşturmak için tek bir çalışma hakkında bir şey hoşuna gitmedi. ..

Bunun için bir düzeltme var mı? Teşekkürler!

cevap

0

Sorunun kaynağını takip ettim. Yabancı anahtar ilişkisi olan 2 InnoDB tablosu oluştururken, yabancı anahtar sütunu prior to MySQL 4.1.2 açıkça endeksli olmalıdır. Django'nun ORM'sini kullanarak, bu, yabancı anahtar alanında db_index=True seçeneğini kullanarak yapılabilir. Ancak, Django tarafından oluşturulan SQL'de, yabancı anahtar ilişkisi oluşturulduktan sonra CREATE INDEX bildirimi verilir. Örneğin, aşağıdaki modeller için:

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) 

Django aşağıdaki SQL kodu oluşturur:

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; 

çalıştığınız ALTER TABLE yürütmek için zaman ortaya çıkar MySQL 4.0, bir errno 150 kullanarak bu kodu çalıştırmayı deneyin olursa Beyan. Ama önce CREATE INDEX bildirimi verilirse, her şey bir çekicilik gibi çalışır. Anlayabildiğim kadarıyla, bunun tek çözümü, kendi tablolarınızı manuel olarak oluşturmak ve daha sonra modelleri oluşturmak için inspectdb'u kullanmaktır.

Ayrıca, yeni bir Django ticket oluşturdum.

+0

Tablolarınızı el ile en az karışıklıkla oluşturmak için, ['django-admin.py sql'] çıktısını kopyalayın ve düzenleyin (https://docs.djangoproject.com/en/dev/ref/django-admin/#sql- appname-appname) komutunu kullanın veya ['django-admin.py gümrük '] (https://docs.djangoproject.com/en/dev/ref/django-admin/#sqlcustom-appname-appname) komutunu kullanın. –

4

MySQL docs bu demek: Burada

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.

Post modeli kod bize yanlış ne olabilir görmesine izin. Eğer yapamıyorsanız ve neyin yanlış olduğunu bilmiyorsanız, depo revizyonlarını ikiye katlamaya veya uygulamayı ikiye katlamaya çalışın: uygulamaların yarısını kapatın, doğru eşleşip eşleşmediğine bakın, ardından kötü modeli içeren parçayı ikiye böler, vb.

+0

Yanıtlama için teşekkürler culebrón! Ancak, modellerim buradaki soruna neden olmaz. Yığın izlemede görebileceğiniz gibi, django auth tablolarını oluştururken syncdb başarısız olur. Komut en temel modelde bile başarısız oluyor. – RedsChineseFood

3

Yakın zamanda bu hatayı aldım. Benim durumumda, yabancı anahtar içeren tablo, oluşturacağınız tablo ile karşılaştırarak farklı bir motor kullandığı için bu hata oluştu. Bu sorunu çözmek için tembel bir yolu kullanarak bu iki tablo motorunu birleştirmek geçerli:

ALTER TABLE table_name ENGINE = engine_type; 

Ve benim için çalıştı. Django 1.5 kullanarak

+0

Teşekkürler bu benim için MySQL 5 üzerinde çalıştı – leech

15

hata, mysql varsayılan motor olarak Innodb ile tablo oluşturma hatası oldu.Çözüm, veritabanı için aşağıdaki ayarları eklemekti ve bu sorunla ilgili sorunlar yaratıldı:

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

}