W3docs

MongoDB Datenbank erstellen

Erfahren Sie, wie Sie mit PyMongo eine MongoDB-Datenbank in Python erstellen. Verbindung, Lazy Creation, Datenbanken auflisten und häufige Fehlerquellen.

MongoDB erstellt eine Datenbank erst dann, wenn tatsächlich Daten hineingeschrieben werden. Dieses Verhalten der „Lazy Creation" ist beabsichtigt und eines der ersten Dinge, über die neue Benutzer stolpern. Dieses Kapitel führt Sie durch die Verbindung zu einem MongoDB-Server mit dem Python-Treiber pymongo, erklärt, wann eine Datenbank tatsächlich erstellt wird, zeigt, wie Sie deren Existenz überprüfen, und beschreibt das Bereinigen von Testdatenbanken.

Voraussetzungen

  • Python 3.8 oder höher installiert
  • Ein laufender MongoDB-Server (lokal oder remote). Wenn Sie MongoDB noch nicht installiert haben, lesen Sie zuerst das Kapitel MongoDB Get Started.
  • Der Treiber pymongo installiert:
pip install pymongo

So funktioniert die Erstellung einer MongoDB-Datenbank

Im Gegensatz zu relationalen Datenbanken führen Sie in MongoDB niemals eine CREATE DATABASE-Anweisung aus. Stattdessen gilt:

  1. Sie referenzieren eine Datenbank über das Client-Objekt anhand ihres Namens.
  2. MongoDB hält diese Referenz im Speicher, erstellt jedoch noch nichts auf der Festplatte.
  3. Die Datenbank wird physisch erstellt, wenn Sie zum ersten Mal ein Dokument einfügen oder explizit eine Collection anlegen.

Das bedeutet, client["mydb"] ist immer „erfolgreich" — es gibt ein Database-Objekt zurück, unabhängig davon, ob mydb existiert oder nicht.

Verbindung zu MongoDB herstellen

Importieren Sie MongoClient und öffnen Sie eine Verbindung. Wenn MongoDB auf demselben Rechner mit Standardeinstellungen (Host localhost, Port 27017) läuft, können Sie MongoClient() ohne Argumente aufrufen:

from pymongo import MongoClient

# Connect to the local MongoDB server (localhost:27017)
client = MongoClient()

Um sich mit einem Remote-Server oder einem nicht standardmäßigen Port zu verbinden, übergeben Sie eine Verbindungs-URI:

# 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 verwendet intern einen Connection-Pool — Sie erstellen pro Anwendung einen Client und verwenden ihn für alle Datenbankoperationen wieder.

Eine Datenbankreferenz abrufen

Greifen Sie auf eine Datenbank per Attributname oder Wörterbuch-Schreibweise zu:

# Both lines do exactly the same thing
db = client.my_database
db = client["my_database"]

Verwenden Sie die Wörterbuch-Schreibweise (client["name"]), wenn der Datenbankname Zeichen enthält, die keine gültigen Python-Bezeichner sind, wie etwa Bindestriche.

An diesem Punkt existiert die Datenbank noch nicht auf dem Server. Geben Sie die Datenbankliste des Clients aus, um das zu bestätigen:

print(client.list_database_names())
# Typical output: ['admin', 'config', 'local']
# 'my_database' is NOT listed yet

Die Datenbank durch Einfügen eines Dokuments erstellen

Der einfachste Weg, die Datenbank zu materialisieren, ist das Einfügen eines Dokuments. Das folgende Beispiel erstellt eine Datenbank namens bookstore und eine Collection namens 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())

Nach dem Ausführen dieses Skripts sollten Sie eine Ausgabe ähnlich der folgenden sehen:

Inserted document id: 64a1e3b2c9f1234567890abc
Databases now: ['admin', 'bookstore', 'config', 'local']

bookstore erscheint nun in der Liste, da mindestens ein Dokument darin vorhanden ist.

Überprüfen, ob eine Datenbank existiert

Da eine referenzierte Datenbank möglicherweise nicht existiert, erfordert die Überprüfung die Auswertung der von list_database_names() zurückgegebenen Liste:

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"))  # False

Eine Testdatenbank löschen

Wenn Sie eine Datenbank entfernen möchten (zum Beispiel nach dem Testen), rufen Sie drop_database() auf dem Client auf:

from pymongo import MongoClient

client = MongoClient()
client.drop_database("bookstore")

print("bookstore" in client.list_database_names())  # False

Dadurch werden die Datenbank sowie alle ihre Collections und Dokumente dauerhaft gelöscht. Es gibt keine Bestätigungsabfrage.

Häufige Fehlerquellen

Tippfehler bleiben unbemerkt

Da MongoDB Datenbanken bei Bedarf erstellt, führt ein Tippfehler im Datenbanknamen stillschweigend zur Erstellung einer zweiten Datenbank, anstatt einen Fehler auszulösen:

# Intended: 'bookstore'
# Actual:   'bookstoree'  — a new empty database that never gets data
db = client["bookstoree"]

Definieren Sie Datenbanknamen stets als Konstanten am Anfang Ihres Moduls, um dies zu vermeiden:

DB_NAME = "bookstore"
db = client[DB_NAME]

Leere Datenbanken sind unsichtbar

Wenn Sie eine Datenbank referenzieren, aber nie Daten einfügen, wird list_database_names() sie nicht enthalten. Das kann beim Debuggen verwirrend sein — die Datenbank „existiert" als Python-Objekt, aber nicht auf der Festplatte.

Verbindungsfehler treten erst spät auf

MongoClient() ist auch dann erfolgreich, wenn MongoDB nicht läuft. Der Verbindungsfehler tritt erst auf, wenn Sie eine tatsächliche Anfrage stellen (einfügen, suchen usw.). Umschließen Sie echte Operationen mit einem try/except-Block:

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)

Vollständiges Arbeitsbeispiel

Das folgende in sich geschlossene Skript demonstriert alle in diesem Kapitel behandelten Schritte:

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()

Erwartete Ausgabe (Dokument-ID wird abweichen):

Before insert: False
After insert:  True
Databases:     ['admin', 'config', 'demo_bookstore', 'local']
After drop:    False

Nächste Schritte

  • MongoDB Create Collection — erfahren Sie, wie Sie Collections erstellen und die Lazy Creation auf Collection-Ebene verstehen.
  • MongoDB Insert — fügen Sie einzelne und mehrere Dokumente in eine Collection ein.
  • MongoDB Find — fragen Sie Dokumente aus einer Collection ab.
Was this page helpful?