我不认为你可以逐个更换存储引擎,但是你可以在逐个数据库的基础上进行。这当然意味着例如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的用户:一个数据库模式工作(“管理员”),一个用于一切(用不同的密码):
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项目存储在水银;我有settings.py
把所有在仅由Django的用户和访问的外部文件服务器管理员,我将离开“如何”作为读者的练习......因为我详细解释了其中一些问题的答案,而我现在懒得查看它。)
好了,你可以* *在一个数据库InnoDB的混合和MyISAM。当我的一些外键没有被执行并且其中一些外键的时候,我学到了这一点。因此,将MySQL默认表类型设置为InnoDB是一个好主意。否则,即使转储和随后的重新加载也会改变表类型,如果您忘记转储此信息。 – 2010-11-11 12:28:22
你能解释一下'use('innodb')'的意思和在哪里添加它? – 2012-02-11 08:19:32
默认情况下,'QuerySet'使用'settings.DATABASES ['default']'中指定的数据库。为了使用不同的数据库(例如,在上面的示例中名为innodb的那个数据库),您需要调用QuerySet的''using'函数(例如'Foo.objects.filter(...)。using ( 'innodb的')')。 – 2012-02-11 13:53:32