MongoDB Créer une base de données
Apprenez à créer une base de données MongoDB en Python avec PyMongo : connexion, création différée, liste des bases et erreurs courantes.
MongoDB ne crée pas de base de données tant que vous n'y avez pas réellement écrit de données. Ce comportement de « création différée » est intentionnel et constitue l'une des premières choses qui surprend les nouveaux utilisateurs. Ce chapitre vous guide à travers la connexion à un serveur MongoDB avec le pilote pymongo de Python, la compréhension du moment où une base de données est réellement créée, la vérification de son existence et la suppression des bases de données de test.
Prérequis
- Python 3.8 ou version ultérieure installé
- Un serveur MongoDB en cours d'exécution (local ou distant). Si vous n'avez pas encore installé MongoDB, suivez d'abord le chapitre MongoDB Get Started.
- Le pilote
pymongoinstallé :
pip install pymongoComment fonctionne la création d'une base de données MongoDB
Contrairement aux bases de données relationnelles, vous n'exécutez jamais d'instruction CREATE DATABASE dans MongoDB. À la place :
- Vous référencez une base de données par son nom via l'objet client.
- MongoDB conserve cette référence en mémoire mais ne crée rien sur le disque pour l'instant.
- La base de données est physiquement créée la première fois que vous insérez un document ou créez explicitement une collection.
Cela signifie que client["mydb"] réussit toujours — il retourne un objet Database que mydb existe ou non.
Connexion à MongoDB
Importez MongoClient et ouvrez une connexion. Lorsque MongoDB s'exécute sur la même machine avec les paramètres par défaut (hôte localhost, port 27017), vous pouvez appeler MongoClient() sans arguments :
from pymongo import MongoClient
# Connect to the local MongoDB server (localhost:27017)
client = MongoClient()Pour vous connecter à un serveur distant ou à un port non standard, passez un URI de connexion :
# Generic URI form
client = MongoClient("mongodb://hostname:port")
# Example: remote host on port 27017
client = MongoClient("mongodb://db.example.com:27017")
# Example: with authentication
client = MongoClient("mongodb://username:[email protected]:27017")MongoClient utilise un pool de connexions en interne — vous créez un seul client par application et le réutilisez pour toutes les opérations de base de données.
Obtenir une référence à une base de données
Accédez à une base de données par son nom d'attribut ou par la notation entre crochets :
# Both lines do exactly the same thing
db = client.my_database
db = client["my_database"]Utilisez la notation entre crochets (client["name"]) lorsque le nom de la base de données contient des caractères qui ne sont pas des identifiants Python valides, comme les traits d'union.
À ce stade, la base de données n'existe pas encore sur le serveur. Affichez la liste des bases de données du client pour le confirmer :
print(client.list_database_names())
# Typical output: ['admin', 'config', 'local']
# 'my_database' is NOT listed yetCréer la base de données en insérant un document
La façon la plus simple de matérialiser la base de données est d'insérer un document. L'exemple ci-dessous crée une base de données appelée bookstore et une collection appelée books :
from pymongo import MongoClient
client = MongoClient()
db = client["bookstore"]
books = db["books"]
# Inserting the first document triggers physical database creation
result = books.insert_one({
"title": "The Pragmatic Programmer",
"author": "David Thomas",
"year": 1999
})
print("Inserted document id:", result.inserted_id)
print("Databases now:", client.list_database_names())Après avoir exécuté ce script, vous devriez voir une sortie similaire à :
Inserted document id: 64a1e3b2c9f1234567890abc
Databases now: ['admin', 'bookstore', 'config', 'local']bookstore apparaît maintenant dans la liste car au moins un document y existe.
Vérifier si une base de données existe
Comme une base de données référencée peut exister ou non, la vérification nécessite d'inspecter la liste retournée par list_database_names() :
from pymongo import MongoClient
client = MongoClient()
def database_exists(client, name):
return name in client.list_database_names()
print(database_exists(client, "bookstore")) # True (if created above)
print(database_exists(client, "no_such_db")) # FalseSupprimer une base de données de test
Lorsque vous souhaitez supprimer une base de données (par exemple après des tests), appelez drop_database() sur le client :
from pymongo import MongoClient
client = MongoClient()
client.drop_database("bookstore")
print("bookstore" in client.list_database_names()) # FalseCela supprime définitivement la base de données ainsi que toutes ses collections et ses documents. Il n'y a pas de confirmation demandée.
Erreurs courantes
Les fautes de frappe sont silencieuses
Comme MongoDB crée des bases de données à la demande, une faute de frappe dans le nom crée silencieusement une deuxième base de données au lieu de lever une erreur :
# Intended: 'bookstore'
# Actual: 'bookstoree' — a new empty database that never gets data
db = client["bookstoree"]Définissez toujours les noms de bases de données comme des constantes en haut de votre module pour éviter cela :
DB_NAME = "bookstore"
db = client[DB_NAME]Les bases de données vides sont invisibles
Si vous référencez une base de données sans jamais insérer de données, list_database_names() ne l'inclura pas. Cela peut rendre le débogage confus — la base de données « existe » en tant qu'objet Python mais pas sur le disque.
Les erreurs de connexion apparaissent tardivement
MongoClient() réussit même lorsque MongoDB n'est pas en cours d'exécution. L'erreur de connexion n'apparaît que lorsque vous effectuez une vraie requête (insertion, recherche, etc.). Encadrez les opérations réelles dans un bloc try/except :
from pymongo import MongoClient
from pymongo.errors import ConnectionFailure
client = MongoClient(serverSelectionTimeoutMS=3000)
try:
# This forces a real network round-trip
client.admin.command("ping")
print("Connected to MongoDB")
except ConnectionFailure as e:
print("Could not connect:", e)Exemple complet fonctionnel
Le script autonome suivant illustre toutes les étapes couvertes dans ce chapitre :
from pymongo import MongoClient
from pymongo.errors import ConnectionFailure
DB_NAME = "demo_bookstore"
def main():
client = MongoClient(serverSelectionTimeoutMS=3000)
# Verify the connection
try:
client.admin.command("ping")
except ConnectionFailure as e:
print("MongoDB is not reachable:", e)
return
# Before any insert, the database does not appear in the list
print("Before insert:", DB_NAME in client.list_database_names())
db = client[DB_NAME]
books = db["books"]
# Insert a document — this creates the database
books.insert_one({"title": "Clean Code", "author": "Robert C. Martin"})
# Now the database is visible
print("After insert: ", DB_NAME in client.list_database_names())
print("Databases: ", client.list_database_names())
# Clean up
client.drop_database(DB_NAME)
print("After drop: ", DB_NAME in client.list_database_names())
if __name__ == "__main__":
main()Sortie attendue (l'identifiant du document sera différent) :
Before insert: False
After insert: True
Databases: ['admin', 'config', 'demo_bookstore', 'local']
After drop: FalseÉtapes suivantes
- MongoDB Create Collection — apprenez à créer des collections et comprendre la création différée au niveau des collections.
- MongoDB Insert — insérez un ou plusieurs documents dans une collection.
- MongoDB Find — interrogez des documents dans une collection.