Django задает систему хранения и стандартную кодировку

132
13

Создание моих таблиц из моего 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


UPDATE:
Я думал, что это могут быть настройки по умолчанию MySQL, и я закончил тем, что изменил my.cnf, где добавил default-character-set = utf8. Но бесполезно.

спросил(а) 2021-01-28T00:22:00+03:00 4 месяца, 4 недели назад
1
Решение
189

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

ответил(а) 2021-01-28T00:22:00+03:00 4 месяца, 4 недели назад
78

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 ;

ответил(а) 2021-01-28T00:22:00+03:00 4 месяца, 4 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема