9

从我的models.py. 我不知道怎么做两件事-

  1. 我想指定MySQL将我的一些表创建为InnoDB& 一些作为MyISAM. 我该怎么做?
  2. 我还想将我的表指定DEFAULT CHARSETutf8. 我该怎么做?

这是我跑步时看到的syncdb——

...
) ENGINE=MyISAM DEFAULT CHARSET=latin1

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

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

4

2 回答 2

18

我不认为您可以逐个表更改存储引擎,但您可以逐个数据库地更改存储引擎。当然,这意味着 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 用户和服务器管理员可访问的外部文件中提取所有内容。我将将“如何”作为练习留给读者……因为我在回答其他人的问题时详细说明了其中的一些内容,而我现在懒得查。)

于 2010-11-11T06:44:02.270 回答
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 ;
于 2015-03-01T16:47:11.743 回答