Django set Storage Engine & Default Charset

Создание моих таблиц из моего models.py, Я не знаю, как сделать 2 вещи -

  1. я хочу уточнить MySQL создать некоторые из моих таблиц как InnoDB и некоторые как MyISAM, Как мне это сделать?
  2. Также я хочу указать мои таблицы 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 ;
Другие вопросы по тегам