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

Sri*_*aju 8 mysql django django-models character-encoding storage-engines

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

  1. 我想指定MySQL创建一些我的表作为InnoDB和一些MyISAM.我该怎么做?
  2. 此外,我想指定我的表DEFAULT CHARSET作为utf8.我该怎么做?

这就是我跑步时看到的syncdb-

...
) ENGINE=MyISAM DEFAULT CHARSET=latin1
Run Code Online (Sandbox Code Playgroud)

我使用Ubuntu 10.04,Django 1.2.X,MySQL 5.1.X

更新:我认为这些可能是MySQL的默认设置,我最终改变my.cnf了我添加的位置default-character-set = utf8.但没有用.

Mik*_*one 17

我不认为您可以逐个表更改存储引擎,但您可以逐个数据库地进行更改.当然,这意味着InnoDB外键约束,例如,不能应用于MyISAM表的外键.

所以你需要声明两个"数据库",它们很可能在同一台服务器上:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        #...
    }
    'innodb': {
        'ENGINE': 'django.db.backends.mysql',
        #...
        'OPTIONS': { 'init_command': 'SET storage_engine=INNODB;' }
    }
}
Run Code Online (Sandbox Code Playgroud)

而且您只需要using('innodb')在InnoDB域中应用查询表.

至于UTF-8,我认为你需要在数据库级别这样做.我不认为syncdb为您创建数据库,只为表创建数据库.您应该手动创建数据库,这样您就可以在运行之前设置权限syncdb.您想要的数据库创建命令是:

CREATE DATABASE django CHARACTER SET utf8;
Run Code Online (Sandbox Code Playgroud)

也就是说,我通常建议人们在数据库中创建两个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;
Run Code Online (Sandbox Code Playgroud)

(请注意,这需要为每个数据库完成.)

为此,您需要修改manage.py:

import sys
if len(sys.argv) >= 2 and sys.argv[1] in ["syncdb", "dbshell", "migrate"]:
    os.environ['DJANGO_ACCESS'] = "ADMIN"
Run Code Online (Sandbox Code Playgroud)

然后在您settings.py的环境中使用环境变量来选择正确的设置.确保站点(即非管理员)用户是默认用户.

(此外,我不存储数据库设置,SECRET_KEY或其他任何敏感的settings.py因为我的Django项目存储在Mercurial中;我已经settings.py从只有Django的用户和服务器管理员访问的外部文件中提取所有内容.我会留下"如何"作为读者的练习......因为我在解答其他人的问题时详细介绍了一些问题,而且我现在懒得查看它.)

  • 好吧,你可以*将InnoDB和MyISAM混合在一个数据库中.当我的一些外键没有被强制执行并且其中一些是外键时,我很难学到它.因此,将MySQL默认表类型设置为InnoDB是个好主意.否则,如果您忘记转储此信息,即使转储和后续重新加载也可以更改表类型. (3认同)