sql >> Databasteknik >  >> RDS >> Mysql

Django set Storage Engine &Default Charset

Jag tror inte att du kan ändra lagringsmotorer på en tabell-för-tabell-basis, men du kan göra det på en databas-för-databas. Detta innebär givetvis att begränsningar för InnoDB främmande nyckel, till exempel, inte kan tillämpas på främmande nycklar till MyISAM-tabeller.

Så du måste deklarera två "databaser", som mycket väl kan finnas på samma server:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        #...
    }
    'innodb': {
        'ENGINE': 'django.db.backends.mysql',
        #...
        'OPTIONS': { 'init_command': 'SET storage_engine=INNODB;' }
    }
}

Och du behöver bara använda using('innodb') till frågeuppsättningar för tabeller i InnoDB-land.

När det gäller UTF-8, återigen, tror jag att du måste göra detta på databasnivå. Jag tror inte syncdb skapar databasen åt dig, bara tabellerna. Du bör skapa databasen manuellt ändå, så att du kan ha privilegier inställda precis innan du kör syncdb . Kommandot för att skapa databas du vill ha är:

CREATE DATABASE django CHARACTER SET utf8;

Som sagt, jag brukar rekommendera att folk skapar två django-användare i databasen:en för databasschemaarbete ("admin") och en för allt annat (med olika lösenord):

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;

(Observera att detta måste göras för varje databas.)

För att detta ska fungera måste du ändra manage.py :

import sys
if len(sys.argv) >= 2 and sys.argv[1] in ["syncdb", "dbshell", "migrate"]:
    os.environ['DJANGO_ACCESS'] = "ADMIN"

Sedan i din settings.py , använd miljövariabeln för att välja rätt inställningar. Se till att webbplatsanvändaren (dvs. icke-admin) är standard.

(Dessutom lagrar jag inte databasinställningarna, SECRET_KEY , eller något annat känsligt i settings.py eftersom mitt Django-projekt är lagrat i Mercurial; Jag har settings.py dra in allt detta från en extern fil som endast är tillgänglig för Djangos användare och serveradministratörerna. Jag lämnar "hur" som en övning för läsaren... eftersom jag beskrev en del av det i svar på andras frågor, och jag är för lat för att slå upp det just nu.)



  1. Hur man installerar Oracle på en Mac

  2. Skapa ett databaspostkonto i SQL Server (T-SQL)

  3. hur kan jag skapa ett taggningssystem med php och mysql?

  4. Now() vs GetDate()