Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Django set Storage Engine &Default Charset


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.)