Django设置存储引擎&默认字符集

时间:2010-11-11 06:12:01

标签: mysql django django-models character-encoding storage-engines

models.py创建表格。我不知道如何做两件事 -

  1. 我想指定MySQL来创建我的一些表格InnoDB&一些为MyISAM。我该怎么办?
  2. 另外,我想将我的表DEFAULT CHARSET指定为utf8。我该怎么办?
  3. 这是我在运行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 个答案:

答案 0 :(得分:17)

我认为您不能逐个更改存储引擎,但您可以逐个数据库地进行更改。当然,这意味着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的用户和服务器管理员才能访问的外部文件。我将把“如何”作为读者的练习...因为我在回答其他人的问题时详细说明了一些,我也是现在懒得看。)

答案 1 :(得分:2)

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 ;