Utilisez l'ODM de MongoDB avec Python

Préface

Cet article est une suite de l'article Premiers pas avec MongoDB en Python. Il est structuré de manière à ce que vous puissiez comprendre le contenu sans lire l'article précédent. Si vous êtes intéressé par MongoDB, nous vous serions reconnaissants de bien vouloir rester avec nous jusqu'à la fin.

Environnement

MongoDB Dans cet article, nous allons créer l'environnement à l'aide de Docker. Si vous souhaitez installer MongoDB directement localement, veuillez vous référer à l'article précédent. : point_up_tone1:

docker-compose.yml


version: '3.1'

services:

  mongo:
    image: mongo
    restart: always
    ports:
      - 27017:27017      
    environment:
      MONGO_INITDB_ROOT_USERNAME: root
      MONGO_INITDB_ROOT_PASSWORD: example

  mongo-express:
    image: mongo-express
    restart: always
    ports:
      - 8081:8081
    environment:
      ME_CONFIG_MONGODB_ADMINUSERNAME: root
      ME_CONFIG_MONGODB_ADMINPASSWORD: example

Lancez le conteneur.

docker-compose up -d mongo mongo-express

Si vous pouvez accéder et afficher Mongo Express, la construction de l'environnement MongoDB est terminée. キャプチャ.PNG

Python

Le côté Python utilise une bibliothèque appelée mongoengine.

pip install mongoengine

Essayez de vous connecter. Essayez de vous connecter à la base de données locale incluse par défaut.

test.py


from mongoengine import connect

connect(db='local',
        username="root",
        password="example",
        host='192.168.99.100',
        port=27017,
        authentication_mechanism='SCRAM-SHA-1',
        authentication_source='admin'
        )

Exécutez-le, et s'il n'y a pas d'erreur, il réussit. Voir ici pour d'autres méthodes de connexion: point_right_tone1: Premiers pas avec MongoDB en Python

ODM MongoDB

Qu'est-ce que ODM, littéralement mappage de document objet. Mappez des objets à une base de données de documents comme MongoDB. L'avantage de son utilisation est que vous pouvez lier la structure des données.

Voyons un exemple

test.py



from mongoengine import connect, Document, EmbeddedDocument, \
    StringField, IntField, DateTimeField, ListField, EmbeddedDocumentField
from datetime import datetime

connect(db='company',
        username="root",
        password="example",
        host='192.168.99.100',
        port=27017,
        authentication_mechanism='SCRAM-SHA-1',
        authentication_source='admin'
        )


class Employee(EmbeddedDocument):
    """
Détails de l'employé
    """
    name = StringField(required=True)
    age = IntField(required=False)


SCALE_CHOICES = (
    ("venture", "Entreprise"),
    ("major", "Majeur")
)


class Company(Document):
    """
Modèle d'entreprise
    """
    name = StringField(required=True, max_length=32)
    scale = StringField(required=True, choices=SCALE_CHOICES)
    created_at = DateTimeField(default=datetime.now())
    members = ListField(EmbeddedDocumentField(Employee))

Si vous avez déjà défini un modèle en utilisant Django ou sqlalchemy, c'est une configuration familière. Mettons les données dans MongoDB en utilisant le modèle réellement défini. Ajoutez le code suivant à test.py et exécutez-le. : point_up_tone1: Vous n'avez pas besoin de créer une base de données de test à l'avance.

test.py



class TestMongoEngine:
    def add_one(self):
       c_obj = Company(
           name="Entreprise célèbre",
           scale="venture",
       )
       c_obj.save()
       return c_obj


if __name__ == "__main__":
        t = TestMongoEngine()
        t.add_one()

Depuis Mongo Express, vous pouvez voir que les données ont été saisies.

キャプチャ.PNG

ʻEmbeddedDocumentField` est utile lorsque vous souhaitez définir plus de structure à l'intérieur du modèle, je vais donc l'utiliser.

Modifiez le code ajouté à test.py comme suit et exécutez-le à nouveau.

test.py



class TestMongoEngine:
    def add_one(self):
       member1 = Employee(
               name="memberA",
               age=40,
       )
       member2 = Employee(
               name="memberB",
               age=35,
       )
       c_obj = Company(
           name="Célèbre entreprise A",
           scale="venture",
           members=[member1, member2]
       )
       c_obj.save()
       return c_obj


if __name__ == "__main__":
        t = TestMongoEngine()
        t.add_one()

Vérifiez le résultat de Mongo Express. キャプチャ.PNG

CRUD utilisant ODM

C (Créer) L'exemple d'ajout d'un nouveau a été introduit dans le premier exemple, nous allons donc commencer par lire les données.

Lecture des données R (récupération)

Lecture unique

Lisez une donnée de la base de données nouvellement ajoutée.

test.py


...
class TestMongoEngine: 
    def get_one(self):
        return Company.objects.first()

if __name__ == "__main__":
        t = TestMongoEngine()
        rest = t.get_one()
        print(rest.id)
        print(rest.name)

résultat


5e7ed47419d1a75baa2bc3f3
Entreprise célèbre

Lis tout

test.py


...
class TestMongoEngine:
    def get_more(self):
        return Company.objects.all()

if __name__ == "__main__":
        t = TestMongoEngine()
        rest = t.get_more()
        print(rest)

résultat

[<Company: Company object>, <Company: Company object>, <Company: Company object>]

Recherche par identifiant

test.py


...
class TestMongoEngine:
      def get_from_oid(self, oid):
          return Company.objects.filter(pk=oid).first()

if __name__ == "__main__":
        t = TestMongoEngine()
        rest = t.get_from_oid("5e7ed47419d1a75baa2bc3f3")
        print(rest.id)
        print(rest.name)

résultat

5e7ed47419d1a75baa2bc3f3
Entreprise célèbre

Supplément

Si vous souhaitez réorganiser l'ordre lors de la lecture des données, ajoutez meta au modèle d'entreprise.

test.py


class Company(Document):
    """
Modèle d'entreprise
    """
    name = StringField(required=True, max_length=32)
    scale = StringField(required=True, choices=SCALE_CHOICES)
    created_at = DateTimeField(default=datetime.now())
    members = ListField(EmbeddedDocumentField(Employee))
    meta = {
        'ordering': ['-created_at']  #Ajouter une méta
    }

Documents

Mettre à jour les données

Modification unique des données

test.py


...
class TestMongoEngine:
    def update(self):
        rest = Company.objects.filter(name="Entreprise célèbre").update_one(name="Entreprise ordinaire")
        return rest

if __name__ == "__main__":
        t = TestMongoEngine()
        rests = t.update()

Après l'exécution, vous pouvez voir que les données ont changé depuis Mongo Express. キャプチャ.PNG

Corrections de données multiples

Il y a deux enregistrements dans MongoDB où name est la célèbre entreprise A, nous les corrigerons. キャプチャ.PNG

test.py


class TestMongoEngine:
    def update(self):
        rest = Company.objects.filter(name="Célèbre entreprise A").update(name="Célèbre entreprise B")
        return rest

if __name__ == "__main__":
        t = TestMongoEngine()
        rests = t.update()
        print(rests)

Résultat d'exécution

2

Vous pouvez également confirmer que les données ont été corrigées à partir de Mongo Express. キャプチャ.PNG

Suprimmer les données

Suppression unique de données

test.py


class TestMongoEngine:
    def delete(self):
        rest = Company.objects.filter(name="Entreprise ordinaire").first().delete()
        return rest

if __name__ == "__main__":
        t = TestMongoEngine()
        rests = t.delete()
        print(rests)

Après exécution

キャプチャ.PNG

Supprimer plusieurs données

Supprimez les deux données dont le «nom» est «célèbre entreprise B».

test.py


...
class TestMongoEngine:
    def delete(self):
        rest = Company.objects.filter(name="Célèbre entreprise B").delete()
        return rest

if __name__ == "__main__":
        t = TestMongoEngine()
        rests = t.delete()
        print(rests)

Résultat d'exécution

2

Lorsque j'ai vérifié depuis Mongo Express, toutes les données de CompanyDB ont été supprimées.

Postscript

Documentation MongoEngine La prochaine fois, j'aimerais écrire un article sur la création d'un service Web à l'aide de Flask et MongoDB.

Recommended Posts

Utilisez l'ODM de MongoDB avec Python
Utilisez config.ini avec Python
Utiliser Valgrind avec Python
Utiliser le profileur en Python
Voyons comment utiliser def en python
Utiliser l'expression let en Python
Utiliser le protocole de mesure avec Python
Utiliser la fonction de rappel en Python
Utiliser le magasin de paramètres en Python
Utiliser le cache HTTP en Python
Utiliser un dict clé de liste en Python
Utiliser Random Forest avec Python
Tri décroissant avec mongodb en python
Utilisez Spyder de Python IDE
Comment utiliser SQLite en Python
Utiliser rospy avec virtualenv dans Python3
Comment utiliser Mysql avec python
Utiliser Python mis en pyenv avec NeoVim
Comment utiliser ChemSpider en Python
Comment utiliser PubChem avec Python
Utiliser OpenCV avec Python 3 dans Window
Quadtree en Python --2
CURL en Python
Métaprogrammation avec Python
[Introduction à Python] Comment utiliser la classe en Python?
Python 3.3 avec Anaconda
Géocodage en python
SendKeys en Python
Utiliser l'impression dans l'expression lambda Python2
Méta-analyse en Python
Unittest en Python
Utilisez facilement vos propres fonctions en Python
Discord en Python
Allemand en Python
DCI en Python
tri rapide en python
nCr en python
N-Gram en Python
Programmation avec Python
Un moyen simple d'utiliser Wikipedia avec Python
Plink en Python
Constante en Python
MongoDB avec Python pour la première fois
N'utilisez pas \ d dans les expressions régulières Python 3!
FizzBuzz en Python
Comment utiliser __slots__ dans la classe Python
Sqlite en Python
Étape AIC en Python
LINE-Bot [0] en Python
CSV en Python
Assemblage inversé avec Python
Réflexion en Python
Constante en Python
Utilisez pathlib dans Maya (Python2.7) en préparation du prochain Python3.7
nCr en Python.
format en python
Scons en Python 3
Comment utiliser les expressions régulières en Python