Я не думаю, что вы можете изменять механизмы хранения для каждой таблицы, но вы можете сделать это для каждой базы данных.Это, конечно, означает, что ограничения внешнего ключа 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 и администраторам сервера. Я оставлю «как» в качестве упражнения для читателя ... потому что я подробно описал некоторые из нихв ответах на вопросы других, и мне сейчас лень это искать.)