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.
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.
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
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.
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.
ʻ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.
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.
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
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>]
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
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
}
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.
Il y a deux enregistrements dans MongoDB où name
est la célèbre entreprise A
, nous les corrigerons.
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.
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
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.
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