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).
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.
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
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',
},
},
}
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é.
Recommended Posts