Comment utiliser ORM / Query Builder Orator de type Laravel avec Django

Cet article est l'article du 0ème jour du "Django Advent Calendar 2019 --Qiita". (Arbitrairement) (je vais me mettre en colère) (je l'effacerai si je me fâche)

Au fait, quel type de bibliothèque DB Access utilise-t-il lorsque vous créez une application Web avec Python? Je pense que le plus populaire est Django ORM. Si vous utilisez Flask ou Pyramid, SQL Alchemy est votre choix. Les personnes travaillant dans le domaine de la science des données peuvent utiliser le DataFrame de Pandas. Mais la bibliothèque que je recommande le plus est "Orator" dans le titre. Il y a déjà quelques articles écrits sur Orator ici à Qiita.

Notez que j'ai touché "Orator" Enregistrer les données récupérées avec Scrapy vers RDB avec ORM

Orator est un constructeur ORM / requête qui a été très influencé par la syntaxe ORM de Laravel. Site officiel Le développement a été lancé par sdispater. Si vous êtes profondément accro à Python, vous le remarquerez peut-être. Récemment, il travaille sur le développement de la poésie. Tout simplement parce qu'elle a été fortement influencée par l'ORM de Laravel, la migration vous oblige à créer votre propre fichier de migration comme Laravel et Rails. Ici, Django se chargera de détecter automatiquement les changements dans la table et de créer un fichier de migration. Mais ce qui rend Orator si génial, c'est la facilité d'écriture des requêtes.

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

Hey? Similaire à SQL et intuitif, non? Vous pouvez connecter autant de jointures et où que vous le souhaitez avec une chaîne de méthodes. Venez avec moi pour toute question complexe!

Alors, comment faites-vous cela dans Django? Je vais commencer le sujet principal à partir d'ici.

Créons orator.py dans l'application

Basé sur la structure de répertoires créée par Django Official Tutorial, orator.py est dans la même hiérarchie que models.py. Créez un fichier appelé.

├── 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

Ensuite, dans orator.py, définissez les informations pour informer les informations de connexion à la base de données dans la bibliothèque orator. Vous pouvez entrer une valeur fixe ici, mais comme les informations de connexion à la base de données sont déjà définies dans settings.py, il est préférable de l'appeler à partir d'ici.

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)

Il existe trois types de «driver», «sqlite», «mysql» et «postgres». Remarque Typo car cela ne fonctionnera que si vous l'écrivez exactement de cette façon.

Extrayez le contenu de settings.py avec from django.conf import settings. Après cela, vous pouvez obtenir la valeur souhaitée en suivant Dict.

Définissons une classe de modèle

La classe de modèle d'Orator, contrairement à Django et SQL Alchemy, n'est pas un schéma de table. Il définit simplement que "cette classe est liée à cette table".

À titre d'exemple, prenons les classes «Question» et «Choice» utilisées dans l'application de sondage du Tutoriel officiel Django. Définissons-le.

mysite/polls/orator.py


class Question(Model):
    __table__ = 'polls_questions'


class Choice(Model):
    __table__ = 'polls_choices'

Le nom de la table créé par Django est préfixé avec le nom de l'application, alors écrivons explicitement le nom de la table en gardant cela à l'esprit. Cependant, la façon dont je développe habituellement est d'éviter de préfixer le nom de l'application lors de la création d'une table dans Django.

mysite/polls/models.py


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

    class Meta:
        # db_Lorsque vous définissez une table, il devient le nom de la table qui est réellement créée.
        db_table = 'questions'

mysite/polls/orator.py


class Question(Model):
    __table__ = 'questions'

Appelons Orator in View

Que se passe-t-il si je réécris la partie de ce code accessible à la base de données dans Django Official Tutorial avec Orator? Ce sera comme suit.

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)

Pourquoi c'est facile! Bravo!

en conclusion

Incorporez Orator dans Django, partageons les rôles avec Orator pour la création / migration de table et le modèle Django pour l'émission de requêtes! Orator peut être d'une grande aide, en particulier dans le développement d'applications Web, où vous émettez souvent des requêtes complexes. Plus répandu!

Recommended Posts

Comment utiliser ORM / Query Builder Orator de type Laravel avec Django
Comment utiliser le bootstrap dans la vue de classe générique Django
Comment utiliser Decorator dans Django et comment le créer
Comment utiliser les classes dans Theano
Comment vérifier le comportement d'ORM avec un fichier avec django
Comment utiliser SQLite en Python
Comment générer une requête à l'aide de l'opérateur IN dans Django
Comment refléter CSS dans Django
Comment utiliser Mysql avec python
Comment utiliser ChemSpider en Python
Comment utiliser PubChem avec Python
Comment utiliser les colonnes calculées dans CASTable
[Introduction à Python] Comment utiliser la classe en Python?
Comment supprimer des sessions expirées dans Django
Comment utiliser Google Test en langage C
Comment utiliser l'interpréteur d'Anaconda avec PyCharm
Comment utiliser __slots__ dans la classe Python
Comment faire des événements envoyés par le serveur dans Django
Comment utiliser les expressions régulières en Python
Comment utiliser Map dans ViewPager d'Android
Comment utiliser is et == en Python
Comment utiliser la bibliothèque C en Python
Comment implémenter la fonctionnalité de type helper Rails dans Django
Comment utiliser la bibliothèque d'images Python dans la série python3
Comment refléter ImageField dans Django + Docker (oreiller)
Résumé de l'utilisation de MNIST avec Python
Comment utiliser tkinter avec python dans pyenv
Comment créer une API Rest dans Django
Comment utiliser xml.etree.ElementTree
Comment utiliser Python-shell
Remarques sur l'utilisation de tf.data
Comment utiliser virtualenv
Comment utiliser Seaboan
Comment utiliser la correspondance d'image
Comment utiliser le shogun
Comment utiliser Virtualenv
Comment utiliser numpy.vectorize
Comment utiliser pytest_report_header
Comment utiliser partiel
Comment utiliser Bio.Phylo
Comment utiliser SymPy
Comment utiliser x-means
Comment utiliser WikiExtractor.py
Comment utiliser IPython
Comment utiliser virtualenv
Comment utiliser Matplotlib
Comment utiliser iptables
Comment utiliser numpy
Comment utiliser TokyoTechFes2015
Comment utiliser venv
Comment utiliser le dictionnaire {}
Comment utiliser Pyenv
Comment utiliser la liste []
Comment utiliser python-kabusapi
Comment utiliser OptParse
Comment utiliser le retour
Comment utiliser pyenv-virtualenv