我认为您不能逐个表更改存储引擎,但可以在按数据库进行更改。 当然,这意味着例如InnoDB外键约束无法应用于对MyISAM表的外键。
因此,您需要声明两个“数据库”,这两个数据库可能在同一服务器上:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
#...
}
'innodb': {
'ENGINE': 'django.db.backends.mysql',
#...
'OPTIONS': { 'init_command': 'SET storage_engine=INNODB;' }
}
}
你只需要在针对InnoDB的表的查询集上应用using('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用户和服务器管理员可以访问的外部文件中提取所有这些内容。至于如何实现,请留给读者自行探讨...因为我已经在回答其他人的问题时详细说明了一些,而且现在懒得再去查了。)
using('innodb')
是什么意思以及应该在哪里添加吗? - nizam.spQuerySet
使用settings.DATABASES['default']
中指定的数据库。如果要使用不同的数据库(例如上面示例中命名为'innodb'
的数据库),则需要在QuerySet
上调用using
函数(例如Foo.objects.filter(...).using('innodb')
)。 - Mike DeSimone