Django set Storage Engine & кодировка по умолчанию

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

  1. Я хочу указать MySQL создать некоторые из моих таблиц InnoDB и как MyISAM. Как мне это сделать?
  2. также я хочу указать свои таблицы DEFAULT CHARSET as 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 land.

что касается 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; I есть 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 ;