8

從我的models.py創建我的表。我唐諾如何做兩件事情 -Django設置存儲引擎和默認字符集

  1. 我想指定MySQL創造一些我的表作爲InnoDB &有的MyISAM。我該怎麼做?
  2. 另外我想指定我的表DEFAULT CHARSETutf8。我該怎麼做?

這是我所看到的,當我運行syncdb -

... 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 

我使用Ubuntu 10.04,Django的1.2.X中,MySQL的5.1.x

UPDATE: 我想這些可能是MySQL默認設置&我最終更改了my.cnf,我在其中添加了default-character-set = utf8。但沒有用。

回答

17

我不認爲你可以逐個更換存儲引擎,但是你可以在逐個數據庫的基礎上進行。這當然意味着例如InnoDB外鍵約束不能應用於MyISAM表的外鍵。

所以你需要聲明兩個「數據庫」,這很可能是在同一臺服務器上:

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

而你只需要申請using('innodb')到查詢集在InnoDB的土地表。

至於UTF-8,我認爲你需要在數據庫級別做到這一點。我不認爲syncdb爲你創建數據庫,只是表格。您應該手動創建數據庫,因此您可以在運行syncdb之前設置權限。你想在數據庫創建命令是:

CREATE DATABASE django CHARACTER SET utf8; 

這就是說,我通常建議人們在數據庫中創建兩個Django的用戶:一個數據庫模式工作(「管理員」),一個用於一切(用不同的密碼):

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; 

(請注意,這需要爲每個數據庫做)

對於這個工作,你需要修改manage.py

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

然後在您的settings.py中,使用環境變量選擇正確的設置。確保網站(即非管理員)用戶是默認用戶。

(另外,我不存儲數據庫設置,SECRET_KEY,或其他任何敏感settings.py,因爲我的Django項目存儲在水銀;我有settings.py把所有在僅由Django的用戶和訪問的外部文件服務器管理員,我將離開「如何」作爲讀者的練習......因爲我詳細解釋了其中一些問題的答案,而我現在懶得查看它。)

+3

好了,你可以* *在一個數據庫InnoDB的混合和MyISAM。當我的一些外鍵沒有被執行並且其中一些外鍵的時候,我學到了這一點。因此,將MySQL默認表類型設置爲InnoDB是一個好主意。否則,即使轉儲和隨後的重新加載也會改變表類型,如果您忘記轉儲此信息。 – 2010-11-11 12:28:22

+0

你能解釋一下'use('innodb')'的意思和在哪裏添加它? – 2012-02-11 08:19:32

+0

默認情況下,'QuerySet'使用'settings.DATABASES ['default']'中指定的數據庫。爲了使用不同的數據庫(例如,在上面的示例中名爲innodb的那個數據庫),您需要調用QuerySet的''using'函數(例如'Foo.objects.filter(...)。using ( 'innodb的')')。 – 2012-02-11 13:53:32

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

感謝您的原始代碼。 – 2016-03-17 05:48:21