Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

[Projeto] Projeto Extract and Save

Para o desafio da aula 2 de Pipeline de dados: integrando Python com MongoDB e MySQL, criei o código abaixo:

from pymongo.mongo_client import MongoClient
from pymongo.server_api import ServerApi
import requests as req

class mongodb:
    def __init__(self,uri):
        self.uri = uri
        self.client = self.__connect_mongo()
        self.db = None
        self.col = None

    def __connect_mongo(self):
        # Create a new client and connect to the server
        client = MongoClient(self.uri, server_api=ServerApi('1'))

        # Send a ping to confirm a successful connection
        try:
            client.admin.command('ping')
            print("You successfully connected to MongoDB!")
        except Exception as e:
            print(e)
        
        return client
    
    def create_connect_db(self,db_name):
        db = self.client[db_name]

        self.db = db

        return db
    
    def create_connect_collection(self,collection_name):
        col = self.db[collection_name]

        self.col = col

        return col

    def extract_api_data(self,url):
        resp = req.get(url).json()

        return resp
    
    def insert_data(self,data):
        self.col.insert_many(data)

    def list_databases(self):
        bases = self.client.list_database_names()

        return bases
    
    def list_collections(self):
        cols = self.db.list_collection_names()

        return cols
        
        
print('Olá, bem vindo a conexão Python_MongoBd')

uri = input('\nDigite sua "uri" para iniciar:\n')

mongo = mongodb(uri)

print('\nEscolha qual database deseja conectar, ou digite um novo nome para criar:')
print(mongo.list_databases())
database = input('\ndb: ')

mongo.create_connect_db(database)

if len(mongo.list_collections()) == 0:
    collection = input('\nDigite o nome do novo collection:\n')
else:
    print('\nEscolha qual collection deseja conectar, ou digite um novo nome para criar:')
    print(mongo.list_collections())
    collection = input('\nCollection: ')

mongo.create_connect_collection(collection)

url = input('\nDigite a url api que deseja extrair os dados: \n')

dados = mongo.extract_api_data(url)

resp = ''

while resp.lower() != 'n' and resp.lower() != 's':
    print(f'\nForam extraídos {len(dados)} deseja inserí-los na collection {collection} na base {database}?')
    resp = input('(S/N): ')

if resp.lower() == 's':
    mongo.insert_data(dados)
    print('\nDados inseridos com sucesso!')
else:
    print('\nOperação abortada!')

Ele funciona bem, só em alguns dos testes que depois que colo minha uri, os sistema não responde, não retorna erro, nem tão pouco sucesso, sendo necessário interromper e reiniciá-lo, talvez algum problema de conexão com o mongo.

1 resposta
solução!

Ei, Paulo! Tudo bem?

Obrigada por compartilhar sua atividade com a comunidade. Parabéns por todo empenho! O código está bem estruturado, gostei da modulararização das funções, create_connect_db e extract_api_data, facilitando a reutilização e manutenção do código.

Sobre a falha de conexão sem retorno ao inserir a URI, você pode testar algumas sugestões, como:

1.) Pode definir um tempo limite (timeout) para a conexão, para que o script não fique esperando indefinidamente por uma resposta. Você pode fazer isso alterando a forma como o MongoClient é instanciado, por exemplo:

client = MongoClient(self.uri, server_api=ServerApi('1'), serverSelectionTimeoutMS=5000)

2.) Adicione mais logs para capturar informações sobre o que está acontecendo quando a conexão falha. Isso pode ajudar a identificar se o problema é na rede, na URI ou em outro ponto.

3.) Verifique se há algum firewall ou configuração de rede que possa estar bloqueando a conexão com o MongoDB.

Continue se dedicando aos estudos e qualquer dúvida, compartilhe no fórum.

Alura Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!