[PYTHON] Verwendung von Laravel-ähnlichem ORM / Query Builder Orator mit Django

Dieser Beitrag ist der Artikel zum 0. Tag von "Django Adventskalender 2019 - Qiita". (Willkürlich) (Ich werde wütend) (Ich werde es löschen, wenn ich wütend werde)

Welche Art von Bibliothek verwendet DB Access übrigens, wenn Sie eine Webanwendung mit Python erstellen? Ich denke, das beliebteste ist Django ORM. Wenn Sie Flask oder Pyramid verwenden, ist SQL Alchemy Ihre Wahl. Personen im Bereich Data Science verwenden möglicherweise den DataFrame von Pandas. Aber die Bibliothek, die ich am meisten empfehle, ist "Orator" im Titel. Es gibt bereits einige Artikel über Orator hier in Qiita.

Beachten Sie, dass ich "Orator" berührt habe Mit Scrapy gekratzte Daten mit ORM in RDB speichern

Orator ist ein ORM / Abfrage-Builder, der stark von der ORM-Syntax von Laravel beeinflusst wurde. Offizielle Website Es war Mr. Sdispater, der mit der Entwicklung begann. Wenn Sie stark von Python abhängig sind, werden Sie es vielleicht bemerken. Vor kurzem arbeitet er an der Entwicklung der Poesie. Nur weil es stark von Laravels ORM beeinflusst wurde, müssen Sie für die Migration eine eigene Migrationsdatei wie Laravel und Rails erstellen. Hier ist Django dafür verantwortlich, Änderungen in der Tabelle automatisch zu erkennen und eine Migrationsdatei zu erstellen. Das Tolle an Orator ist jedoch, dass Sie problemlos Anfragen schreiben können.

students = Student \
    .select('id', 'name', 'email') \
    .join('class', 'class.num', '=', 'students.class_num') \
    .where('class.id', 3) \
    .get()

Hallo? SQL-ähnlich und intuitiv, oder? Sie können beliebig viele Verknüpfungen mit einer Methodenkette verbinden und wo Sie möchten. Kommen Sie mit mir für jede komplexe Frage!

Wie bringt man das nach Django? Ich werde das Hauptthema von hier aus beginnen.

Lassen Sie uns orator.py in der Anwendung erstellen

Basierend auf der von Django Official Tutorial erstellten Verzeichnisstruktur befindet sich orator.py in derselben Hierarchie wie models.py. Erstellen Sie eine Datei mit dem Namen.

├── mysite
│   ├── polls
│   │   ├── __init__.py
│   │   ├── admin.py
│   │   ├── apps.py
│   │   ├── migrations
│   │   │   └── __init__.py
│   │   ├── models.py
│   │   ├── orator.py ←←←←←←←NEW!!!
│   │   ├── tests.py
│   │   ├── urls.py
│   │   └── views.py
│   ├── manage.py
│   ├── mysite
│   │   ├── __init__.py
│   │   ├── settings.py
│   │   ├── urls.py
│   │   └── wsgi.py
│   └── templates

Legen Sie als Nächstes in orator.py die Informationen fest, um die Verbindungsinformationen zur Datenbank in der Rednerbibliothek zu informieren. Sie können hier einen festen Wert eingeben. Da die Verbindungsinformationen zur Datenbank jedoch bereits in settings.py definiert sind, ist es besser, sie von hier aus aufzurufen.

mysite/polls/orator.py


import logging

from orator import DatabaseManager
from orator import Model
from django.conf import settings

config = {
    'mysql': {
        'driver': 'mysql',
        'database': settings.DATABASES['default']['NAME'],
        'host': settings.DATABASES['default']['HOST'],
        'user': settings.DATABASES['default']['USER'],
        'password': settings.DATABASES['default']['PASSWORD'],
        'prefix': ''
        'log_queries': True,
    }
}


db = DatabaseManager(config)
Model.set_connection_resolver(db)


logger = logging.getLogger('orator.connection.queries')
logger.setLevel(logging.DEBUG)

formatter = logging.Formatter(
    'It took %(elapsed_time)sms to execute the query %(query)s'
)

handler = logging.StreamHandler()
handler.setFormatter(formatter)

logger.addHandler(handler)

Es gibt drei Arten von "Treiber": "SQLite", "MySQL" und "Postgres". Hinweis Tippfehler, da er nur funktioniert, wenn Sie ihn genau so schreiben.

Ziehen Sie den Inhalt von settings.py mit from django.conf import settings ab. Danach können Sie den gewünschten Wert erhalten, indem Sie Dict folgen.

Definieren wir eine Modellklasse

Die Modellklasse von Orator ist im Gegensatz zu Django und SQL Alchemy kein Tabellenschema. Es definiert einfach, dass "diese Klasse an diese Tabelle gebunden ist".

Nehmen wir als Beispiel die Klassen "Frage" und "Auswahl", die in der Umfrage-App in Django Official Tutorial verwendet werden. Definieren wir es.

mysite/polls/orator.py


class Question(Model):
    __table__ = 'polls_questions'


class Choice(Model):
    __table__ = 'polls_choices'

Dem von Django erstellten Tabellennamen wird der Anwendungsname vorangestellt. Schreiben Sie daher den Tabellennamen explizit in diesem Sinne. Normalerweise entwickle ich jedoch, indem ich beim Erstellen einer Tabelle mit Django das Präfixieren des Anwendungsnamens vermeide.

mysite/polls/models.py


class Question(models.Model):
    question_text = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')

    class Meta:
        # db_Wenn Sie eine Tabelle definieren, wird dies zum Namen der Tabelle, die tatsächlich erstellt wird.
        db_table = 'questions'

mysite/polls/orator.py


class Question(Model):
    __table__ = 'questions'

Rufen wir Orator in View an

Was passiert, wenn ich den DB-Zugriff auf diesen Teil dieses Codes in Django Official Tutorial mit Orator neu schreibe? Es wird wie folgt sein.

mysite/polls/views.py


from django.shortcuts import render

- from .models import Question
+ from .orator import Question

def index(request):
    - latest_question_list = Question.objects.order_by('-pub_date')[:5]
    + latest_question_list = Question.order_by('pub_date', 'asc').limit(5)
    context = {'latest_question_list': latest_question_list}
    return render(request, 'polls/index.html', context)

Warum einfach! Bravo!

abschließend

Integrieren Sie Orator in Django und teilen Sie die Rollen mit Orator für die Tabellenerstellung / -migration und dem Django-Modell für die Ausgabe von Abfragen. Orator kann eine große Hilfe sein, insbesondere bei der Entwicklung von Web-Apps, bei denen Sie häufig komplexe Abfragen stellen. Weiter verbreitet!

Recommended Posts

Verwendung von Laravel-ähnlichem ORM / Query Builder Orator mit Django
Verwendung von Bootstrap in der generischen Klassenansicht von Django
Wie man Decorator in Django benutzt und wie man es macht
Verwendung von Klassen in Theano
So überprüfen Sie das Verhalten von ORM mit einer Datei mit django
Verwendung von SQLite in Python
So generieren Sie eine Abfrage mit dem IN-Operator in Django
Wie man CSS in Django reflektiert
Wie man MySQL mit Python benutzt
Verwendung von ChemSpider in Python
Verwendung von PubChem mit Python
Verwendung berechneter Spalten in CASTable
[Einführung in Python] Wie verwende ich eine Klasse in Python?
So löschen Sie abgelaufene Sitzungen in Django
Verwendung von Google Test in C-Sprache
Verwendung von Anacondas Interpreter mit PyCharm
Verwendung von __slots__ in der Python-Klasse
So führen Sie vom Server gesendete Ereignisse in Django durch
Verwendung regulärer Ausdrücke in Python
So verwenden Sie Map in ViewPager von Android
Verwendung ist und == in Python
Verwendung der C-Bibliothek in Python
So implementieren Sie Rails-Helfer-ähnliche Funktionen in Django
Verwendung der Python-Bildbibliothek in der Python3-Serie
So reflektieren Sie ImageField in Django + Docker (Kissen)
Zusammenfassung der Verwendung von MNIST mit Python
Wie man tkinter mit Python in Pyenv benutzt
So erstellen Sie eine Rest-API in Django
Verwendung von xml.etree.ElementTree
Wie benutzt man Python-Shell
Hinweise zur Verwendung von tf.data
Verwendung von virtualenv
Wie benutzt man Seaboan?
Verwendung von Image-Match
Wie man Shogun benutzt
Verwendung von Virtualenv
Verwendung von numpy.vectorize
Verwendung von pytest_report_header
Wie man teilweise verwendet
Wie man Bio.Phylo benutzt
Verwendung von SymPy
Wie man x-means benutzt
Verwendung von WikiExtractor.py
Verwendung von IPython
Verwendung von virtualenv
Wie benutzt man Matplotlib?
Verwendung von iptables
Wie benutzt man numpy?
Verwendung von TokyoTechFes2015
Wie benutzt man venv
Verwendung des Wörterbuchs {}
Wie benutzt man Pyenv?
Verwendung der Liste []
Wie man Python-Kabusapi benutzt
Verwendung von OptParse
Verwendung von return