8

models.py sayfamdaki tablolarım oluşturma.Django set Depolama Altyapısı ve Varsayılan Karakter Aralığı

  1. Ben MyISAM olarak InnoDB & bazı olarak benim bazı tabloların oluşturmak için MySQL belirtmek istiyorum - Ben donno nasıl 2 şey yapmak. Nasıl yaparım?
  2. Ayrıca tablolarım DEFAULT CHARSETutf8 olarak belirtmek istiyorum. Nasıl yaparım?

Bu ben syncdb çalıştırdığınızda gördüklerimi olduğunu -

... 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 

Ben Ubuntu 10,04 Django 1.2.x, MySQL 5.1.x

GÜNCELLEME kullanın: Bunları düşündüm belki MySQL varsayılan ayarları & olmak default-character-set = utf8 ekledim my.cnf değiştirerek sona erdi. Ama hiçbir işe yaramaz.

cevap

17

Depolama motorlarını tablo bazında değiştirebileceğinizi düşünmüyorum, ancak veritabanı bazında yapabilirsiniz. Bu, tabii ki, InnoDB'nin yabancı anahtar kısıtlamalarının, örneğin, yabancı anahtarları MyISAM tablolarına uygulayamayacağı anlamına gelir.

Yani çok iyi aynı sunucuda olabilir iki "veritabanları" ifadesini gerekir:

DATABASES = { 
    'default': { 
     'ENGINE': 'django.db.backends.mysql', 
     #... 
    } 
    'innodb': { 
     'ENGINE': 'django.db.backends.mysql', 
     #... 
     'OPTIONS': { 'init_command': 'SET storage_engine=INNODB;' } 
    } 
} 

Ve InnoDB'nin topraklarda tablolar için Sorgu kümelerini için using('innodb') uygulamak açmanız yeterli olacaktır.

UTF-8'e gelince, bunu veritabanı düzeyinde yapmanız gerektiğini düşünüyorum. syncdb'un sizin için veritabanı oluşturduğunu düşünmüyorum, sadece tablolar. Veritabanını yine de el ile oluşturmalısınız, böylece syncdb'u çalıştırmadan önce ayrıcalıklara sahip olabilirsiniz. İstediğiniz veritabanı oluşturma komut: söylediğin

CREATE DATABASE django CHARACTER SET utf8; 

, genelde insanlar veritabanında iki django kullanıcılar oluşturmak önerilir: veritabanı şeması çalışması ("admin") ve biri de her şey için bir () farklı şifreler ile:

CREATE DATABASE django CHARACTER SET utf8; 
CREATE USER 'django_site'@'localhost' IDENTIFIED BY 'password'; 
GRANT SELECT, INSERT, UPDATE, DELETE ON django.* TO django_site; 
CREATE USER 'django_admin'@'localhost' IDENTIFIED BY 'password'; 
GRANT SELECT, INSERT, UPDATE, DELETE ON django.* TO django_admin; 
GRANT CREATE, DROP, ALTER, INDEX, LOCK TABLES ON django.* TO django_admin; 
FLUSH PRIVILEGES; 

(bu her veritabanı için yapılması gerektiğini unutmayın) Bunun için

çalışmak, sen manage.py değiştirmeniz gerekir.

import sys 
if len(sys.argv) >= 2 and sys.argv[1] in ["syncdb", "dbshell", "migrate"]: 
    os.environ['DJANGO_ACCESS'] = "ADMIN" 

Ardından, settings.py numaralı telefondan, doğru ayarları seçmek için ortam değişkenini kullanın. Sitenin (ör. Yönetici olmayan) kullanıcının varsayılan olduğundan emin olun. Benim Django projesi Mercurial saklanır çünkü

(Ayrıca, ben settings.py veritabanı kurulumu, SECRET_KEY veya başka bir şey duyarlı saklamak değil, ben sadece Django'nın kullanıcı ve erişilebilir Harici bir dosyadan tüm bu çekmek settings.py var Sunucu yöneticileri, okuyucuya bir alıştırma olarak "nasıl" bırakacağım, çünkü bazılarını başkalarının sorularına verdiğim cevaplarla detaylı olarak anlattım ve şu anda bakmaya çok tembelim.)

+3

Eh, * * Bir veritabanında InnoDB ve MyISAM karıştırabilirsiniz. Bazı yabancı anahtarlar zorla uygulanmadığı ve bazılarının zor olduğunu öğrendim. Yani, MySQL varsayılan tablo tipini InnoDB'ye ayarlamak iyi bir fikir. Aksi takdirde, bir çöplük ve müteakip yeniden yükleme bile, bu bilgiyi dökmeyi unutursanız, tablo türlerini değiştirebilir. –

+0

Lütfen ne kullandığını ('innodb') 'anlamına geldiğini ve nereye ekleyebileceğinizi açıklayabilir misiniz? –

+0

A 'QuerySet ', varsayılan olarak," settings.DATABASES [' default '] 'de belirtilen veritabanını kullanır. Farklı bir veritabanı kullanmak için (örneğin yukarıdaki örnekte '' innodb'''olarak), 'QuerySet'de' '' 'fonksiyonunu çağırmanız gerekir (örn.' Foo.objects.filter (...).) '('innodb'). Ham kod için –

2
CREATE TABLE IF NOT EXISTS `users` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `firstname` varchar(32) NOT NULL, 
    `lastname` varchar(32) NOT NULL, 
    `gender` varchar(6) NOT NULL, 
    `email` varchar(32) NOT NULL, 
    `username` varchar(32) NOT NULL, 
    `password` varchar(32) NOT NULL, 
    `created` datetime NOT NULL, 
    `modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=76 ; 
+0

teşekkürler. –

İlgili konular