[PYTHON] Fügen Sie einen Index in eine Spalte ein, die in Django1.7 + MySQL Probleme mit Sushi-Bier verursacht

Zweck

Verwenden Sie utf8mb4 mit Django1.7 + MySQL5.5 oder höher

Wenn du es normal machst

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)

Da die Migration aus der Django 1.7-Serie verwendet werden kann, definieren Sie damit das Modell

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

Ein häufiges Problem mit der InnoDB-Indexgröße

Lösung

http://blog.kamipo.net/entry/2012/11/13/102024 Es ist gut, innodb_large_prefix zu verwenden, wie es hier ist

my.cnf


[client]
default-character-set = utf8mb4

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

Aber wie spezifizieren Sie ROW_FORMAT?

ROW_FORMAT-Spezifikationsmethode 1

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

Dies spiegelt sich jedoch nicht in dem mit Migrationen erstellten Modell wider! !!

ROW_FORMAT-Spezifikationsmethode 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 wird jetzt auch bei der Migration angewendet!

Ergänzung

Abhängig vom in Django eingebauten Modul Einige von ihnen unterstützen die Migration nicht. Verwenden Sie daher beide in Kombination.

Recommended Posts

Fügen Sie einen Index in eine Spalte ein, die in Django1.7 + MySQL Probleme mit Sushi-Bier verursacht
Hinweise zum Aktivieren von PostgreSQL mit Django
[kotlin] Erstellen Sie eine App, die Fotos erkennt, die mit einer Kamera auf Android aufgenommen wurden
Rückblick auf die Erstellung eines Webdienstes mit Django 1
Rückblick auf die Erstellung eines Webdienstes mit Django 2
Starten Sie Django auf einem Docker-Container mit Docker-Compose Up