[PYTHON] Verwenden Sie Unicode 6.0-Piktogramme mit Django / MySQL

Zweck

Von django [in Unicode 6.0 hinzugefügte Piktogramme](http://ja.wikipedia.org/wiki/Unicode6.0%E3%81%AE%E6% 90% BA% E5% B8% AF% E9% 9B% BB% E8% A9% B1% E3% 81% AE% E7% B5% B5% E6% 96% 87% E5% AD% 97% E3% 81% Ich möchte AE% E4% B8% 80% E8% A6% A7) verwenden.

Betriebsumgebung

Python

Python 3.2.0 oder höher ist erforderlich, um Unicode 6.0-Piktogramme zu verwenden.

django

Ich habe die unterstützten Versionen von Django nicht überprüft. Es funktioniert unter 1.7.0 und 1.8.1, also ist es gut.

mysqlclient

Verwenden Sie mysqlclient für die Python 3.x-Serie.

MySQL

Verwenden Sie MySQL 5.5.14 oder höher, wodurch das Limit für das Schlüsselpräfix (siehe unten) auf 3072 Byte erweitert werden kann.

Aufbau

MySQL

Um Piktogramme in MySQL zu speichern, setzen Sie den Zeichencode beim Erstellen der Datenbank auf utf8mb4.

CREATE DATABASE cmtestdb CHARACTER SET utf8mb4;

In MySQL (InnoDB) beträgt der Maximalwert des Schlüsselpräfix einer Spalte 767 Byte. Wenn utf8mb4 angegeben ist, können 767 Bytes ÷ 4 nur bis zu 191 Zeichen verwenden. Der folgende Fehler tritt auf, weil die von der Django Middleware generierte Tabelle Spalten enthält, die größer als 191 Zeichen sind.

Specified key was too long; max key length is 767 bytes

Um diesen Fehler zu vermeiden, nehmen Sie die folgenden Einstellungen in my.cnf vor.

my.cnf


innodb_file_format = Barracuda
innodb_file_per_table = 1
innodb_large_prefix

Sie können das maximale Schlüsselpräfix auf 3072 Byte erweitern, indem Sie innodb_large_prefix angeben.

mysqlclient

Normal installieren.

pip install mysqlclient

django

Datenbankdefinition

Geben Sie beim Herstellen einer Verbindung zu MySQL von django den Zeichencode von utf8mb4 an.

settings.py


DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'DBNAME',
        'USER': 'DBUSER',
        'PASSWORD': 'DBPASSWORD',
        'HOST': 'DBHOST',
        'PORT': '3306',
        'OPTIONS': {
            'charset': 'utf8mb4',
        },
    },
}

Erweiterung der Anweisung "CREATE TABLE"

Um die Angabe von innodb_large_prefix zu aktivieren, geben Sie in der SQL-Anweisung "CREATE TABLE" "ROW_FORMAT = DYNAMIC" oder "ROW_FORMAT = COMPRESSED" an.

python manage.Wenn Sie py migrade laufen"CREATE TABLE"Geben Sie eine SQL-Anweisung aus.


 Die Implementierung von django 1.7 hat keinen Erweiterungspunkt für die SQL-Anweisung "CREATE TABLE" gefunden.
 Fügen Sie daher `` `ROW_FORMAT = DYNAMIC``` hinzu, indem Sie den ursprünglichen SQL-Anweisungsgenerierungsteil" CREATE TABLE "von django 1.7 dynamisch patchen.


#### **`manage.py`**
```python3

import os
import sys

def patch_mysql_sql_create_model(original):
    """
    :param :class:`django.db.backends.creation.BaseDatabaseCreation` original: BaseDatabaseCreation
    :return: BaseDatabaseCreation
    :rtype: :class:`django.db.backends.creation.BaseDatabaseCreation`
    """

    def revised(self, model, style, known_models=set()):
        """
        :class:`django.db.backends.creation.BaseDatabaseCreation` #sql_create_Fügen Sie der Verarbeitung des Modells die folgende Verarbeitung hinzu.
        *Am Ende der SQL-Anweisung'ROW_FORMAT=DYNAMIC;'Hinzufügen.

Die zusätzlichen Bedingungen sind wie folgt.
        *Datenbank ist MySQL
        *Der Anfang der SQL-Anweisung ist'CREATE TABLE'
        """
        fullname = self.__module__ + "." + self.__class__.__name__
        if fullname == 'django.db.backends.mysql.creation.DatabaseCreation':
            original_output, pending_references = original(self, model, style, known_models)

            final_output = []
            for sql in original_output:
                if sql.startswith('CREATE TABLE') is False:
                    continue

                if sql.endswith(';'):
                    sql = sql[:-1]

                sql += 'ROW_FORMAT=DYNAMIC'
                final_output.append(sql)

            return final_output, pending_references
        else:
            return original(self, model, style, known_models)

    return revised

if __name__ == "__main__":
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config.local")

    if len(sys.argv) > 1 and sys.argv[1] == 'migrate':
        import django

        if django.VERSION >= (1, 8):
            from django.db.backends.base.creation import BaseDatabaseCreation
        else:
            from django.db.backends.creation import BaseDatabaseCreation
        BaseDatabaseCreation.sql_create_model = patch_mysql_sql_create_model(BaseDatabaseCreation.sql_create_model)

        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)

Mit den obigen Einstellungen wird `ROW_FORMAT = DYNAMIC``` am Ende der SQL-Anweisung" CREATE TABLE "hinzugefügt, wenn` python manage.py migrate``` ausgeführt wird.

Referenzmaterial

Recommended Posts

Verwenden Sie Unicode 6.0-Piktogramme mit Django / MySQL
Verwenden Sie MySQL mit Django
Verwenden Sie Gentelella mit Django
Verwenden Sie prefetch_related bequem mit Django
[Django] Verwenden Sie MessagePack mit dem Django REST-Framework
Internationalisierung mit Django
CRUD mit Django
Django + MySQL-Einstellungen
MySQL-Herausforderungen für externen Azure-Speicher mit Django (PTVS)
Verwenden Sie Python / Django mit dem Windows Azure Cloud Service!
Django 1.11 wurde mit Python3.6 gestartet
Verwenden Sie mecab-ipadic-neologd mit igo-python
Entwicklungsverdauung mit Django
Verwenden Sie RTX 3090 mit PyTorch
Verwenden Sie ansible mit cygwin
Verwenden Sie pipdeptree mit virtualenv
PDF mit Django ausgeben
[Python] Verwenden Sie JSON mit Python
Verwenden Sie Mock mit Pytest
Markdown-Ausgabe mit Django
Verwenden Sie den Indikator mit pd.merge
Twitter OAuth mit Django
Verwenden Sie MySQL aus Python
Verwenden Sie Mecab mit Python 3
Verwenden Sie Tensorboard mit Chainer
Verwenden Sie DynamoDB mit Python
Verwenden Sie pip mit MSYS2
Erste Schritte mit Django 1
Mail mit Django senden
Verwenden Sie Python 3.8 mit Anaconda
Verwenden Sie Copyright mit Spacemacs
Verwenden Sie TypeScript mit Django-Kompressor
Verwenden Sie MySQL aus Python
Pooling mechanisieren mit Django
Verwenden Sie GPS mit Edison
Django ab heute
Erste Schritte mit Django 2
Verwenden Sie nim mit Jupyter
Es war zu einfach, eine vorhandene Datenbank mit Django zu verwenden
Mach Django mit CodeStar (Python3.6.8, Django2.2.9)
Verwenden Sie gemeinsam genutzten Speicher mit gemeinsam genutzten Bibliotheken
Verwenden Sie benutzerdefinierte Tags mit PyYAML
Verwenden Sie Richtungsdiagramme mit networkx
Fangen Sie mit Django an! ~ Tutorial ⑤ ~
Verwenden Sie TensorFlow mit Intellij IDEA
Minimale Konfigurations-Website-Umgebung mit Django
Erstellen Sie eine API mit Django
Verwenden Sie die Twitter-API mit Python
Verwenden Sie pip mit Jupyter Notebook
Mach Django mit CodeStar (Python3.8, Django2.1.15)
Stellen Sie Django serverlos mit Lambda bereit
Python3 + Django ~ Mac ~ mit Apache
Verwenden Sie DATE_FORMAT mit dem SQLAlchemy-Filter
Verwenden Sie TUN / TAP mit Python
Erste Schritte mit Django: 4_MySQL-Integration
Verwenden Sie sqlite3 mit NAO (Pepper)
Verwenden Sie MySQL von Anaconda (Python)
Erstellen Sie eine Homepage mit Django
Verwenden Sie die load_extensions von sqlite mit Pyramid
Fangen Sie mit Django an! ~ Tutorial ④ ~