[PYTHON] Verwenden Sie: Django-MySQL

Dieser Artikel ist der 5. Tagesartikel von Django Adventskalender 2019.

Einführung

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.

installieren

Installation

pip install django-mysql

Bearbeiten Sie settings.py

Fügen Sie django-mysql zu INSTALLED_APPS hinzu


INSTALLED_APPS = (
    "django.contrib.admin",
    "django.contrib.auth",
    ...
    ...
    "django_mysql",
)

Aktivieren Sie DJANGO_MYSQL_REWRITE_QUERIES


DJANGO_MYSQL_REWRITE_QUERIES = True

Festlegen von sql_mode und innodb_strict_mode

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 verwenden

Modelleinstellungen

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.

Informationen zur erstellten Tabelle

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.

Versuchen Sie IGNORE INDEX

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.

Ende

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.

Beiseite

Ist es ein Logo, wann immer Sie es sehen? Oder besser gesagt, der Charakter ist schlecht. image.png

Recommended Posts

Verwenden Sie: Django-MySQL
Verwenden Sie DeepLabCut
Verwenden Sie pycscope
Verwenden Sie Sammlungen
Verwenden Sie Pylements.rb
Verwenden Sie Numpy
Verwenden Sie Pandas-Ply
Verwenden Sie GitPython
Verwenden Sie Miniconda
Warum Linux verwenden?
[C] Verwenden Sie qsort ()
Verwenden wir pytube
Verwenden Sie die JIRA-API
Verwenden Sie die django-debug-Symbolleiste nicht lokal
Verwenden Sie die Kombinationsoptimierung