[PYTHON] Utiliser les pictogrammes Unicode 6.0 avec django / MySQL

Objectif

De django [Pictogrammes ajoutés dans Unicode 6.0](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% Je veux utiliser AE% E4% B8% 80% E8% A6% A7).

Environnement d'exploitation

Python

Python 3.2.0 ou supérieur est requis pour utiliser les pictogrammes Unicode 6.0.

django

Je n'ai pas vérifié les versions prises en charge de django. Cela fonctionne sur 1.7.0 et 1.8.1, donc c'est bien.

mysqlclient

Utilisez mysqlclient pour la série Python 3.x.

MySQL

Utilisez MySQL 5.5.14 ou supérieur, qui peut étendre la limite de préfixe de clé (décrite ci-dessous) à 3072 octets.

Réglage

MySQL

Pour stocker des pictogrammes dans MySQL, définissez le code de caractère lors de la création de la base de données sur utf8mb4.

CREATE DATABASE cmtestdb CHARACTER SET utf8mb4;

Dans MySQL (InnoDB), la valeur maximale du préfixe de clé d'une colonne est de 767 octets. Lorsque utf8mb4 est spécifié, 767 octets ÷ 4 ne peuvent utiliser que 191 caractères. L'erreur suivante se produit car la table générée par le middleware django contient des colonnes de plus de 191 caractères.

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

Pour éviter cette erreur, définissez les paramètres suivants dans my.cnf.

my.cnf


innodb_file_format = Barracuda
innodb_file_per_table = 1
innodb_large_prefix

Vous pouvez étendre le préfixe de clé maximal à 3072 octets en spécifiant innodb_large_prefix.

mysqlclient

Installez normalement.

pip install mysqlclient

django

Définition de la base de données

Lors de la connexion à MySQL depuis django, spécifiez le code de caractère utf8mb4.

settings.py


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

Extension de l'instruction "CREATE TABLE"

Pour activer la spécification de innodb_large_prefix, spécifiez ROW_FORMAT = DYNAMIC ou `` `ROW_FORMAT = COMPRESSED dans l'instruction SQL" CREATE TABLE ".

python manage.Lorsque vous exécutez py migrade"CREATE TABLE"Émettez une instruction SQL.


 L'implémentation de django 1.7 n'a pas trouvé de point d'extension pour l'instruction SQL "CREATE TABLE".
 Par conséquent, ajoutez `` ROW_FORMAT = DYNAMIC '' en patchant dynamiquement la partie de génération d'instruction SQL originale "CREATE TABLE" de django 1.7.


#### **`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_Ajoutez le traitement suivant au traitement du modèle.
        *À la fin de l'instruction SQL'ROW_FORMAT=DYNAMIC;'Ajouter.

Les conditions supplémentaires sont les suivantes.
        *La base de données est MySQL
        *Le début de l'instruction SQL est'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)

Avec les paramètres ci-dessus, ROW_FORMAT = DYNAMIC sera ajouté à la fin de l'instruction SQL "CREATE TABLE" lorsque` `` python manage.py migrate est exécuté.

Matériel de référence

Recommended Posts

Utiliser les pictogrammes Unicode 6.0 avec django / MySQL
Utiliser MySQL avec Django
Utiliser Gentelella avec Django
Utilisez prefetch_related commodément avec Django
[Django] Utiliser MessagePack avec le framework Django REST
Internationalisation avec Django
CRUD avec Django
Paramètres Django + MySQL
Défis MySQL du stockage externe Azure avec Django (PTVS)
Utilisez Python / Django avec Windows Azure Cloud Service!
Django 1.11 a démarré avec Python3.6
Utilisez mecab-ipadic-neologd avec igo-python
Résumé du développement avec Django
Utilisez RTX 3090 avec PyTorch
Utiliser ansible avec cygwin
Utiliser pipdeptree avec virtualenv
Sortie PDF avec Django
[Python] Utiliser JSON avec Python
Utilisez Mock avec pytest
Sortie Markdown avec Django
Utiliser l'indicateur avec pd.merge
Twitter OAuth avec Django
Utilisez MySQL depuis Python
Utiliser mecab avec Python 3
Utiliser tensorboard avec Chainer
Utiliser DynamoDB avec Python
Utiliser pip avec MSYS2
Premiers pas avec Django 1
Envoyer des e-mails avec Django
Utilisez Python 3.8 avec Anaconda
Utiliser les droits d'auteur avec Spacemacs
Utiliser TypeScript avec django-compresseur
Utiliser MySQL depuis Python
La mutualisation mécanise avec Django
Utiliser le GPS avec Edison
Django à partir d'aujourd'hui
Premiers pas avec Django 2
Utilisez nim avec Jupyter
C'était trop facile d'utiliser une base de données existante avec Django
Faites Django avec CodeStar (Python3.6.8, Django2.2.9)
Utiliser la mémoire partagée avec une bibliothèque partagée
Utiliser des balises personnalisées avec PyYAML
Utiliser des graphiques directionnels avec networkx
Lancez-vous avec Django! ~ Tutoriel ⑤ ~
Utiliser TensorFlow avec Intellij IDEA
Environnement de site Web de configuration minimale avec django
Créer une API avec Django
Utiliser l'API Twitter avec Python
Utiliser pip avec Jupyter Notebook
Faites Django avec CodeStar (Python3.8, Django2.1.15)
Déployer Django sans serveur avec Lambda
Python3 + Django ~ Mac ~ avec Apache
Utiliser DATE_FORMAT avec le filtre SQLAlchemy
Utiliser TUN / TAP avec Python
Django Getting Started: intégration 4_MySQL
Utilisez sqlite3 avec NAO (Pepper)
Utiliser MySQL depuis Anaconda (python)
Créer une page d'accueil avec django
Utilisez les load_extensions de sqlite avec Pyramid
Lancez-vous avec Django! ~ Tutoriel ④ ~