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