Dieser Artikel ist der 5. Tagesartikel von Django Adventskalender 2019.
Djangos ORM kann mehr als genug Abfragen für die Entwicklung ausgeben, indem die Objekte select_related, prefetch_related, Preftch, Q usw. vollständig genutzt werden.
Es gibt jedoch einige Dinge, die nicht erledigt werden können, und in einigen Fällen müssen Sie unformatiertes SQL schreiben. Wenn Sie beispielsweise mehrere Indizes haben, können Sie den Index, den Sie verwenden möchten, "USE_IDNEX" oder den Index, den Sie nicht verwenden möchten, "IGNORE_INDEX" angeben. In diesem Fall müssen Sie unformatiertes SQL schreiben.
Django-MySQL
Wenn Sie hier jedoch Django-MySQL verwenden, können Sie Djangos ORM erweitern, ohne unformatiertes SQL zu schreiben, und Abfragen wie "USE_IDNEX" und "IGNORE_INDEX" ausgeben.
pip install django-mysql
INSTALLED_APPS = (
"django.contrib.admin",
"django.contrib.auth",
...
...
"django_mysql",
)
DJANGO_MYSQL_REWRITE_QUERIES = True
DATABASES = {
"default": {
"ENGINE": "django.db.backends.mysql",
"HOST": "127.0.0.1",
"NAME": "hogehoge",
"USER": "fugafuga",
"OPTIONS": {
"charset": "utf8mb4",
"init_command": "SET sql_mode='STRICT_TRANS_TABLES', innodb_strict_mode=1",
},
}
}
Als Einschränkung bei dieser Änderung tritt ein Fehler auf, wenn der STRICT-Modus aktiviert ist, wenn Sie versuchen, Daten einzufügen / zu aktualisieren, die max_length überschreiten. Wenn Sie den STRICT-Modus nicht aktivieren und Daten einfügen / aktualisieren, die max_length überschreiten, wird der Überschuss ohne Fehler abgeschnitten und verarbeitet. Wenn Sie ihn also nicht ordnungsgemäß validiert haben. Muss vorsichtig sein.
Beachten Sie, dass diese Änderung eine Einstellung ist, wenn Sie von Django aus eine Verbindung zu MySQL herstellen. Sie müssen also nicht neu migrieren oder ähnliches.
Lassen Sie uns in der Benutzeranwendung ein Modell namens hoge erstellen. Setzen Sie einen Index sowohl auf "Fuga" als auch auf "Piyo" des Feldes.
users/hoge.py
from django.db import models
from django_mysql.models import QuerySet
class Hoge(models.Model):
fuga = models.IntegerField(db_index=True)
piyo = models.IntegerField(db_index=True)
objects = QuerySet.as_manager()
Der Unterschied besteht darin, dass Sie "aus django_mysql.models QuerySet importieren" und es als ORM-Manager verwenden können. Auf diese Weise können Sie erweiterte Abfragen in Django-MySQL ausführen.
mysql> show index from users_hoge;
+------------+------------+--------------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+------------+------------+--------------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| users_hoge | 0 | PRIMARY | 1 | id | A | 0 | NULL | NULL | | BTREE | | |
| users_hoge | 1 | users_hoge_fuga_8a4fba19 | 1 | fuga | A | 0 | NULL | NULL | | BTREE | | |
| users_hoge | 1 | users_hoge_piyo_4539c423 | 1 | piyo | A | 0 | NULL | NULL | | BTREE | | |
+------------+------------+--------------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
Es ist so.
Wenn Sie eine Abfrage ohne Verwendung des Fuga-Index ausgeben, gehen Sie wie folgt vor.
python
Hoge.objects.all().ignore_index("users_hoge_fuga_8a4fba19")
Das von diesem ausgegebene SQL ist wie folgt
SELECT
`users_hoge`.`id`,
`users_hoge`.`fuga`,
`users_hoge`.`piyo`
FROM
`users_hoge` IGNORE INDEX(`users_hoge_fuga_8a4fba19`);
Der Ignorierindex wurde ordnungsgemäß ausgegeben.
Wenn Sie dies versuchen, ohne Django-MySQL zu verwenden
AttributeError: 'QuerySet' object has no attribute 'ignore_index'
Ich bekomme so einen Fehler.
Bisher habe ich nur IGNORE INDEX verwendet, aber ich kann Force Index und andere nützliche Funktionen verwenden. Weitere Informationen finden Sie unter [Dokumentation](https://django-mysql.readthedocs.io/en/latest]. Bitte lesen Sie /index.html). Möglicherweise möchten Sie Djnago-MySQL einmal einführen, wenn Sie auf einen Fall stoßen, in dem Sie SQL mit einer sorgfältigen Maßnahme schreiben müssen, die mit normalem ORM nicht realisiert werden kann.
Ist es ein Logo, wann immer Sie es sehen? Oder besser gesagt, der Charakter ist schlecht.
Recommended Posts