[PYTHON] Mettre un index sur une colonne qui cause des problèmes de bière de sushi dans Django1.7 + MySQL

Objectif

Utilisez utf8mb4 avec Django1.7 + MySQL5.5 ou supérieur

Si tu le fais normalement

settings.py


DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'hoge',
        'USER': 'hoge',
        'OPTIONS': {
            'charset': 'utf8mb4',
        }
    }
}

models.py


from django.db import models

class User(models.Model):
    screen_name = models.CharField(max_length=255, unique=True)

Puisque la migration peut être utilisée à partir de la série Django 1.7, utilisez-la pour définir le modèle

create-db


create database hoge DEFAULT CHARSET utf8mb4;

shell


$ python manage.py makemigrations
$ python manage.py migrate

> django.db.utils.OperationalError: (1709, 'Index column size too large. The maximum column size is 767 bytes.')

Un problème de taille d'index InnoDB courant

Solution

http://blog.kamipo.net/entry/2012/11/13/102024 Il est bon d'utiliser ʻinnodb_large_prefix` comme c'est le cas ici

my.cnf


[client]
default-character-set = utf8mb4

[mysqld]
character-set-server = utf8mb4
innodb_file_format = Barracuda
innodb_file_per_table = 1
innodb_large_prefix

Mais comment spécifiez-vous ROW_FORMAT?

Méthode de spécification ROW_FORMAT 1

http://qiita.com/miyagi389/items/ffc9918fd8ef2f2a1a45

Cependant, cela ne se reflète pas dans le modèle réalisé avec les migrations! !!

Méthode de spécification ROW_FORMAT 2

manage.py


#!/usr/bin/env python
# coding: utf-8
from __future__ import unicode_literals
import os
import sys

if __name__ == "__main__":
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "testapp.settings")

    from django.db.backends.mysql.schema import DatabaseSchemaEditor
    DatabaseSchemaEditor.sql_create_table += " ROW_FORMAT=DYNAMIC"

    from django.core.management import execute_from_command_line

    execute_from_command_line(sys.argv)

ROW_FORMAT = DYNAMIC est maintenant appliqué même en migration!

Supplément

En fonction du module intégré à Django Certains d'entre eux ne prennent pas en charge la migration, utilisez donc les deux en combinaison.

Recommended Posts

Mettre un index sur une colonne qui cause des problèmes de bière de sushi dans Django1.7 + MySQL
Remarques sur l'activation de PostgreSQL avec Django
[kotlin] Créez une application qui reconnaît les photos prises avec un appareil photo sur Android
Retour sur la création d'un service Web avec Django 1
Retour sur la création d'un service Web avec Django 2
Lancer Django sur un conteneur Docker à l'aide de docker-compose up