2
respostas

Parâmetro 'con' e print(inspector.get_table_names())

Olá,

Minha primeira dúvida é em relação ao porquê do professor utilizar o parâmetro 'con = engine' na hora de criar a seguinte tabela:

muitas_matriculas.to_sql('muitas_matriculas', con = engine)

Mesmo olhando a documentação, confesso que ainda ficou confuso o porquê disso. A falta de explicação na hora de empregar determinados parâmetros ou criação de variáveis senti bem recorrente nesse curso específico de Pandas IO e, por causa disso, teve aulas que tive que gastar mais de uma hora testando e procurando em documentação ou no fórum.

Minha segunda dúvida é em relação ao que ele faz logo em seguida, utilizando o print que está descontinuado:

print(engine.table_names())

Pelo fato de estar descontinuado, utilizei o outro print que encontra-se na primeira aula "Warning SADeprecation":

print(inspector.get_table_names())

No entanto, a minha saída, mesmo eu tendo criado a tabela "muitas_matriculas", apresenta apenas a primeira ['matriculas'].

A única diferença entre as duas foi a utilização desse 'con = engine' empregado na criação de "muitas_matriculas" e, por isso, gostaria de entender melhor o que aconteceu.

EDIT: Fiz um teste e rodei novamente o

inspector = inspect(engine)

Após isso, rodei o

print(inspector.get_table_names()) 

E agora minha saída apareceram as duas tabelas ['matriculas', 'muitas matriculas']

Por que foi necessário rodar o inspector para que eu possa passar a enxergar o 'muitas matriculas' no print?

2 respostas

Ninguém para responder?

Olá, Bruno, tudo bem?

Desculpe-nos pela demora de responder a sua dúvida.

Respondendo a sua primeira pergunta, acredito que o fato do professor ter escrito engine ao invés de con = engine no primeiro exemplo possa ter gerado uma pequena dúvida se algo de diferente foi feito nesse caso, mas é a mesma ideia. O parâmetro con no método to_sql é responsável por pegar o objeto conexão criado pelo SQLAlchemy, que seria a nossa engine de conexão. Ela foi previamente definida como engine = create_engine('sqlite:///:memory:') que nada mais é que um banco de dados SQLite na memória que usa o módulo built-in do Python chamado sqlite3. Esse banco que estamos utilizando será salvo na memória local.

O nosso método to_sql precisa, para ser executado, de ao menos dois parâmetros: o nome (name) e a conexão (con). Sendo opcional descrevermos os nomes dos argumentos para que ele seja executado corretamente. Ou seja, as formas muitas_matriculas.to_sql(name = 'muitas_matriculas', con = engine) e muitas_matriculas.to_sql('muitas_matriculas', engine) estão ambas corretas.

Para entender um pouco mais sobre como utilizar a biblioteca sqalchemy e o método to_sql , recomendamos que leia alguns dos links indicados:

Para Saber Mais
Trabalhando com Banco de Dados SQL usando Python
Documentação do to_sql (em inglês)
Documentação do SQLAlchemy 1.3 (em inglês)

 

Agora, respondendo a segunda pergunta, é necessário rodar o inspector novamente para que o seu outro banco de dados seja lido devido aos estados de um objeto. Nesse caso, precisamos fazer com que o objeto inspector faça com que a instância dele seja persistente, ou seja, apresente o registro no banco de dados através de uma releitura da conexão em busca de instâncias existentes ou liberando instâncias pendentes para que se tornem persistentes.

Explicando de uma maneira mais lúdica, é como se o inspector abrisse uma porta e perguntasse se tem mais alguém presente para entrar e, caso exista, ele atualiza o banco de dados com as tabelas que estavam esperando para serem lidas e as já existentes.

Para entender um pouco mais sobre os estados de um objeto, indicamos o link da documentação do SQLAlchemy em que fala sobre State Management

 

Espero que tenhamos contribuido para tirar as suas dúvidas e proporcionar a melhor experiência do seu aprendizado aqui na Alura.

Qualquer dúvida é só chamar!

Abraços e bons estudos!