8

从我的models.py创建我的表。我唐诺如何做两件事情 -Django设置存储引擎和默认字符集

  1. 我想指定MySQL创造一些我的表作为InnoDB &有的MyISAM。我该怎么做?
  2. 另外我想指定我的表DEFAULT CHARSETutf8。我该怎么做?

这是我所看到的,当我运行syncdb -

... 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 

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

UPDATE: 我想这些可能是MySQL默认设置&我最终更改了my.cnf,我在其中添加了default-character-set = utf8。但没有用。

回答

17

我不认为你可以逐个更换存储引擎,但是你可以在逐个数据库的基础上进行。这当然意味着例如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的用户和访问的外部文件服务器管理员,我将离开“如何”作为读者的练习......因为我详细解释了其中一些问题的答案,而我现在懒得查看它。)

+3

好了,你可以* *在一个数据库InnoDB的混合和MyISAM。当我的一些外键没有被执行并且其中一些外键的时候,我学到了这一点。因此,将MySQL默认表类型设置为InnoDB是一个好主意。否则,即使转储和随后的重新加载也会改变表类型,如果您忘记转储此信息。 – 2010-11-11 12:28:22

+0

你能解释一下'use('innodb')'的意思和在哪里添加它? – 2012-02-11 08:19:32

+0

默认情况下,'QuerySet'使用'settings.DATABASES ['default']'中指定的数据库。为了使用不同的数据库(例如,在上面的示例中名为innodb的那个数据库),您需要调用QuerySet的''using'函数(例如'Foo.objects.filter(...)。using ( 'innodb的')')。 – 2012-02-11 13:53:32

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 ; 
+0

感谢您的原始代码。 – 2016-03-17 05:48:21