W3docs

MongoDB Criar Banco de Dados

Aprenda a criar um banco de dados MongoDB em Python com PyMongo. Conexão, criação lazy, listagem de bancos de dados e dicas importantes.

O MongoDB não cria um banco de dados até que você efetivamente grave dados nele. Esse comportamento de "criação lazy" é intencional e é uma das primeiras coisas com que novos usuários se deparam. Este capítulo mostra como conectar-se a um servidor MongoDB com o driver pymongo do Python, entender quando um banco de dados é realmente criado, verificar que ele existe e remover bancos de dados de teste.

Pré-requisitos

  • Python 3.8 ou superior instalado
  • Um servidor MongoDB em execução (local ou remoto). Se você ainda não instalou o MongoDB, siga primeiro o capítulo MongoDB Get Started.
  • O driver pymongo instalado:
pip install pymongo

Como Funciona a Criação de Banco de Dados no MongoDB

Ao contrário dos bancos de dados relacionais, você nunca executa uma instrução CREATE DATABASE no MongoDB. Em vez disso:

  1. Você referencia um banco de dados pelo nome através do objeto cliente.
  2. O MongoDB mantém essa referência em memória, mas não cria nada em disco ainda.
  3. O banco de dados é criado fisicamente na primeira vez que você insere um documento ou cria explicitamente uma coleção.

Isso significa que client["mydb"] é sempre "bem-sucedido" — retorna um objeto Database independentemente de mydb existir ou não.

Conectando-se ao MongoDB

Importe MongoClient e abra uma conexão. Quando o MongoDB está em execução na mesma máquina com as configurações padrão (host localhost, porta 27017), você pode chamar MongoClient() sem argumentos:

from pymongo import MongoClient

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

Para conectar-se a um servidor remoto ou a uma porta não padrão, passe uma URI de conexão:

# 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 utiliza um pool de conexões internamente — você cria um cliente por aplicação e o reutiliza em todas as operações de banco de dados.

Obtendo uma Referência ao Banco de Dados

Acesse um banco de dados pelo nome do atributo ou por notação de chave no estilo dicionário:

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

Use o estilo de dicionário (client["name"]) quando o nome do banco de dados contém caracteres que não são identificadores Python válidos, como hifens.

Neste ponto, o banco de dados ainda não existe no servidor. Imprima a lista de bancos de dados do cliente para confirmar:

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

Criando o Banco de Dados ao Inserir um Documento

A maneira mais simples de materializar o banco de dados é inserir um documento. O exemplo abaixo cria um banco de dados chamado bookstore e uma coleção chamada 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())

Após executar este script, você deverá ver uma saída semelhante a:

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

bookstore agora aparece na lista porque pelo menos um documento existe nele.

Verificando se um Banco de Dados Existe

Como um banco de dados referenciado pode ou não existir, a verificação requer inspecionar a lista retornada por 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"))  # False

Removendo um Banco de Dados de Teste

Quando você deseja remover um banco de dados (por exemplo, após testes), chame drop_database() no cliente:

from pymongo import MongoClient

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

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

Isso exclui permanentemente o banco de dados e todas as suas coleções e documentos. Não há confirmação solicitada.

Problemas Comuns

Erros de digitação são silenciosos

Como o MongoDB cria bancos de dados sob demanda, um erro de digitação no nome do banco de dados cria silenciosamente um segundo banco de dados em vez de gerar um erro:

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

Sempre defina nomes de bancos de dados como constantes no topo do seu módulo para evitar isso:

DB_NAME = "bookstore"
db = client[DB_NAME]

Bancos de dados vazios são invisíveis

Se você referencia um banco de dados mas nunca insere dados, list_database_names() não o incluirá. Isso pode tornar a depuração confusa — o banco de dados "existe" como um objeto Python, mas não em disco.

Erros de conexão aparecem tarde

MongoClient() tem sucesso mesmo quando o MongoDB não está em execução. O erro de conexão só aparece quando você faz uma requisição real (insert, find, etc.). Envolva operações reais em um bloco 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)

Exemplo Completo Funcional

O script autocontido a seguir demonstra todas as etapas abordadas neste capítulo:

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

Saída esperada (o id do documento será diferente):

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

Próximos Passos

Was this page helpful?