我不认为您可以逐个表更改存储引擎,但您可以逐个数据库更改存储引擎。当然,这意味着 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 中,使用环境变量选择正确的设置。确保站点(即非管理员)用户是默认用户。
(另外,我没有在settings.py 中存储数据库设置SECRET_KEY 或任何其他敏感信息,因为我的Django 项目存储在Mercurial 中;我有settings.py 从可访问的外部文件中提取所有内容仅由 Django 的用户和服务器管理员提供。我将把“如何”作为练习留给读者……因为我在回答其他人的问题时详细说明了其中的一些内容,我懒得去查找它了现在。)