Não acho que você possa alterar os mecanismos de armazenamento tabela por tabela, mas pode fazê-lo banco de dados por banco de dados. Isso, é claro, significa que as restrições de chave estrangeira do InnoDB, por exemplo, não podem ser aplicadas a chaves estrangeiras para tabelas MyISAM.
Então você precisa declarar dois "bancos de dados", que podem muito bem estar no mesmo servidor:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
#...
}
'innodb': {
'ENGINE': 'django.db.backends.mysql',
#...
'OPTIONS': { 'init_command': 'SET storage_engine=INNODB;' }
}
}
E você só precisa aplicar
using('innodb')
para conjuntos de consultas para tabelas na terra do InnoDB. Quanto ao UTF-8, novamente, acho que você precisa fazer isso no nível do banco de dados. Eu não acho que
syncdb
cria o banco de dados para você, apenas as tabelas. Você deve criar o banco de dados manualmente de qualquer maneira, para que possa ter privilégios definidos antes de executar o syncdb
. O comando de criação de banco de dados que você deseja é:CREATE DATABASE django CHARACTER SET utf8;
Dito isso, geralmente recomendo que as pessoas criem dois usuários django no banco de dados:um para trabalho de esquema de banco de dados ("admin") e outro para todo o resto (com senhas diferentes):
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;
(Observe que isso precisa ser feito para cada banco de dados.)
Para que isso funcione, você precisa modificar
manage.py
:import sys
if len(sys.argv) >= 2 and sys.argv[1] in ["syncdb", "dbshell", "migrate"]:
os.environ['DJANGO_ACCESS'] = "ADMIN"
Em seguida, em seu
settings.py
, use a variável de ambiente para escolher as configurações corretas. Certifique-se de que o usuário do site (ou seja, não administrador) seja o padrão. (Além disso, não armazeno a configuração do banco de dados,
SECRET_KEY
, ou qualquer outra coisa sensível em settings.py
porque meu projeto Django está armazenado no Mercurial; Eu tenho settings.py
extraia tudo isso de um arquivo externo acessível apenas pelo usuário do Django e pelos administradores do servidor. Vou deixar o "como" como exercício para o leitor... porque eu detalhei um pouco dele em respostas a outras perguntas, e estou com preguiça de pesquisar agora.)