Django set Storage Engine & Default Charset
Создание моих таблиц из моего models.py
, Я не знаю, как сделать 2 вещи -
- я хочу уточнить
MySQL
создать некоторые из моих таблиц какInnoDB
и некоторые какMyISAM
, Как мне это сделать? - Также я хочу указать мои таблицы
DEFAULT CHARSET
какutf8
, Как мне это сделать?
Это то, что я вижу, когда бегу syncdb
-
...
) ENGINE=MyISAM DEFAULT CHARSET=latin1
Я использую Ubuntu 10.04, Django 1.2.X, MySQL 5.1.X
ОБНОВЛЕНИЕ: я думал, что это могли быть настройки по умолчанию MySQL, и я закончил тем, что изменил my.cnf
где я добавил default-character-set = utf8
, Но бесполезно.
2 ответа
Я не думаю, что вы можете изменить механизмы хранения для каждой таблицы, но вы можете сделать это для каждой базы данных. Это, конечно, означает, что ограничения внешнего ключа 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 в базе данных: одного для работы схемы базы данных ("admin") и одного для всего остального (с разными паролями):
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 хранится в Mercurial; я имею settings.py
вытащить все это из внешнего файла, доступного только пользователю Django и администраторам сервера. Я оставлю "как" в качестве упражнения для читателя... потому что я подробно изложил некоторые из них в ответах на вопросы других, и мне лень сейчас их искать.)
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 ;