{"id":335975,"date":"2023-03-24T12:34:34","date_gmt":"2023-03-24T11:34:34","guid":{"rendered":"https:\/\/blog.jetbrains.com\/?post_type=pycharm&#038;p=335975"},"modified":"2023-03-24T12:34:38","modified_gmt":"2023-03-24T11:34:38","slug":"usando-o-pycharm-para-ler-dados-de-um-banco-de-dados-mysql-em-pandas","status":"publish","type":"pycharm","link":"https:\/\/blog.jetbrains.com\/pt-br\/pycharm\/2023\/03\/usando-o-pycharm-para-ler-dados-de-um-banco-de-dados-mysql-em-pandas\/","title":{"rendered":"Usando o PyCharm para ler dados de um banco de dados MySQL em pandas"},"content":{"rendered":"<p>Mais cedo ou mais tarde na sua jornada de ci\u00eancia de dados, voc\u00ea chegar\u00e1 a um ponto em que precisar\u00e1 obter dados de um banco de dados. No entanto, o salto entre ler um arquivo CSV armazenado localmente para o pandas e conectar e consultar bancos de dados pode parecer uma tarefa assustadora. Na primeira de uma s\u00e9rie de postagens de blog, exploraremos como ler dados armazenados em um banco de dados MySQL em pandas e veremos alguns recursos interessantes do PyCharm que facilitam essa tarefa.<\/p>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-320796\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2023\/01\/Blog_Featured_image_1280x600-10.png\" alt=\"\" width=\"2560\" height=\"1200\" \/><\/figure>\n<\/div>\n<h2>Visualizando o conte\u00fado do banco de dados<\/h2>\n<p>Neste tutorial, vamos ler alguns dados sobre atrasos e cancelamentos de companhias a\u00e9reas de um banco de dados MySQL para um DataFrame do pandas. Esses dados s\u00e3o uma vers\u00e3o do conjunto de dados <a href=\"https:\/\/www.kaggle.com\/datasets\/priankravichandar\/airline-delays-from-20032016\" target=\"_blank\" rel=\"noopener\">\u201cAirline Delays from 2003-2016\u201d<\/a>, por <a href=\"https:\/\/www.kaggle.com\/priankravichandar\" target=\"_blank\" rel=\"noopener\">Priank Ravichandar<\/a> e licenciada sob a <a href=\"https:\/\/creativecommons.org\/publicdomain\/zero\/1.0\/\" target=\"_blank\" rel=\"noopener\">CC0 1.0<\/a>.<\/p>\n<p>Uma das primeiras coisas que podem ser frustrantes ao se trabalhar com bancos de dados \u00e9 n\u00e3o ter uma vis\u00e3o geral dos dados dispon\u00edveis, j\u00e1 que todas as tabelas s\u00e3o armazenadas num servidor remoto. Portanto, o primeiro recurso do PyCharm que usaremos \u00e9 a janela de ferramentas <em>Database<\/em>, que permite que voc\u00ea se conecte e introspeccione totalmente um banco de dados antes de fazer qualquer consulta.<\/p>\n<p>Para se conectar ao nosso banco de dados MySQL, vamos primeiro navegar para o lado direito do PyCharm e clicar na janela de ferramentas <em>Database<\/em>.<\/p>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-316933\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2023\/01\/mysql-1-database-tool-window-2800x1339.png\" alt=\"\" width=\"2800\" height=\"1339\" \/><\/figure>\n<\/div>\n<p>No canto superior esquerdo dessa janela, voc\u00ea ver\u00e1 um bot\u00e3o de adi\u00e7\u00e3o. Clicar nele ativa a seguinte janela de di\u00e1logo suspensa, na qual selecionaremos <em>Data Source <\/em>| <em>MySQL<\/em>.<\/p>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-316944\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2023\/01\/mysql-2-new-data-source-2800x1340.png\" alt=\"\" width=\"2800\" height=\"1340\" \/><\/figure>\n<\/div>\n<p>Agora, temos uma janela pop-up que nos permitir\u00e1 abrir uma conex\u00e3o ao nosso banco de dados MySQL. Neste caso, estamos usando um banco de dados hospedado localmente, ent\u00e3o deixamos <em>Host<\/em> como \u201clocalhost\u201d e <em>Port<\/em> como a porta MySQL padr\u00e3o de \u201c3306\u201d. Usaremos a op\u00e7\u00e3o de <em>Authentication<\/em> \u201cUser &amp; Password\u201d e digitaremos o valor \u201cpycharm\u201d para <em>User<\/em> e para <em>Password<\/em>. Por fim, vamos inserir \u201cdemo\u201d para como o nome do banco de dados em <em>Database<\/em>. Obviamente, para se conectar ao seu pr\u00f3prio banco de dados MySQL, voc\u00ea precisar\u00e1 do host espec\u00edfico, do nome do banco de dados e do seu nome de usu\u00e1rio e senha. Consulte <a href=\"https:\/\/www.jetbrains.com\/help\/pycharm\/mysql.html\" target=\"_blank\" rel=\"noopener\">a documenta\u00e7\u00e3o<\/a> para conhecer o conjunto completo de alternativas.<\/p>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-316955\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2023\/01\/mysql-3-connecting-to-mysql.png\" alt=\"\" width=\"1612\" height=\"1366\" \/><\/figure>\n<\/div>\n<p>Em seguida, clique em <em>Test Connection<\/em>. O PyCharm nos informa que n\u00e3o temos os arquivos de driver instalados. V\u00e1 em frente e clique em <em>Download Driver Files<\/em>. Um dos recursos mais interessantes da janela de ferramentas <em>Database<\/em> \u00e9 que ela localiza e instala automaticamente os drivers corretos.<\/p>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-316966\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2023\/01\/mysql-4-install-drivers.png\" alt=\"\" width=\"1614\" height=\"1368\" \/><\/figure>\n<\/div>\n<p>Sucesso! N\u00f3s nos conectamos ao nosso banco de dados. Agora, podemos navegar at\u00e9 a aba <em>Schemas<\/em> e selecionar quais esquemas queremos examinar. Em nosso banco de dados de exemplo, temos apenas uma (\u201cdemo\u201d), mas, nos casos em que voc\u00ea possui bancos de dados muito grandes, pode economizar tempo analisando apenas os relevantes.<\/p>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-316977\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2023\/01\/mysql-5-select-schemas.png\" alt=\"\" width=\"1616\" height=\"1368\" \/><\/figure>\n<\/div>\n<p>Com tudo isso feito, estamos prontos para nos conectar ao nosso banco de dados. Clique em <em>OK<\/em> e aguarde alguns segundos. Agora, voc\u00ea pode ver que todo o nosso banco de dados foi instrospeccionado, at\u00e9 o n\u00edvel dos campos da tabela e seus tipos. Isso nos d\u00e1 uma \u00f3tima vis\u00e3o geral do que est\u00e1 no banco de dados antes de executar qualquer consulta.<\/p>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-316988\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2023\/01\/mysql-6-introspected-db.png\" alt=\"\" width=\"1206\" height=\"1466\" \/><\/figure>\n<\/div>\n<h2>Lendo os dados com o MySQL Connector<\/h2>\n<p>Agora que sabemos o que est\u00e1 em nosso banco de dados, estamos prontos para montar uma consulta. Digamos que queremos ver os aeroportos que tiveram pelo menos 500 atrasos em 2016. Observando os campos na tabela introspectiva <code>airlines<\/code>, vemos que podemos obter esses dados com a seguinte consulta:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"sql\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">SELECT AirportCode,\n      SUM(FlightsDelayed) AS TotalDelayed\n   FROM airlines\n   WHERE TimeYear = 2016\n   GROUP BY AirportCode\n   HAVING SUM(FlightsDelayed) &gt; 500;<\/pre>\n<p>A primeira maneira de executar essa consulta usando o Python \u00e9 atrav\u00e9s de um pacote chamado MySQL Connector, que pode ser instalado a partir do <a href=\"https:\/\/pypi.org\/project\/mysql-connector-python\/\" target=\"_blank\" rel=\"noopener\">PyPI<\/a> ou <a href=\"https:\/\/anaconda.org\/anaconda\/mysql-connector-python\" target=\"_blank\" rel=\"noopener\">Anaconda<\/a>. Consulte a documenta\u00e7\u00e3o vinculada se precisar de orienta\u00e7\u00e3o sobre como configurar ambientes <a href=\"https:\/\/www.jetbrains.com\/help\/pycharm\/creating-virtual-environment.html\" target=\"_blank\" rel=\"noopener\">pip<\/a> ou <a href=\"https:\/\/www.jetbrains.com\/help\/pycharm\/conda-support-creating-conda-virtual-environment.html\" target=\"_blank\" rel=\"noopener\">conda<\/a> ou sobre como <a href=\"https:\/\/www.jetbrains.com\/help\/pycharm\/installing-uninstalling-and-upgrading-packages.html\" target=\"_blank\" rel=\"noopener\">instalar depend\u00eancias<\/a>. Assim que a instala\u00e7\u00e3o for conclu\u00edda, abriremos um <a href=\"https:\/\/www.jetbrains.com\/help\/pycharm\/jupyter-notebook-support.html#get-started\" target=\"_blank\" rel=\"noopener\">novo notebook Jupyter<\/a> e importaremos o MySQL Connector e o pandas.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import mysql.connector\nimport pandas as pd<\/pre>\n<p>Para ler dados do nosso banco de dados, precisamos criar um <a href=\"https:\/\/dev.mysql.com\/doc\/connector-python\/en\/connector-python-connecting.html\" target=\"_blank\" rel=\"noopener\">conector<\/a>. Isto \u00e9 feito usando o m\u00e9todo <code>connect<\/code>, para o qual passamos as credenciais necess\u00e1rias para acessar o banco de dados: <code>host<\/code>, <code>database<\/code>, <code>user<\/code> e <code>password<\/code>. Estas s\u00e3o as mesmas credenciais que usamos para acessar o banco de dados usando a janela de ferramentas <em>Database<\/em> na se\u00e7\u00e3o anterior.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">mysql_db_connector = mysql.connector.connect(\n   host=\"localhost\",\n   database=\"demo\",\n   user=\"pycharm\",\n   password=\"pycharm\"\n)<\/pre>\n<p>Agora, precisamos criar um <a href=\"https:\/\/dev.mysql.com\/doc\/connector-python\/en\/connector-python-api-mysqlcursor.html\" target=\"_blank\" rel=\"noopener\">cursor<\/a>. Isto ser\u00e1 usado para executar nossas consultas SQL no banco de dados e usar\u00e1 as credenciais ordenadas no nosso conector para obter acesso.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">mysql_db_cursor = mysql_db_connector.cursor()<\/pre>\n<p>Agora, estamos prontos para executar nossa consulta. Fazemos isso usando o <a href=\"https:\/\/dev.mysql.com\/doc\/connector-python\/en\/connector-python-api-mysqlcursor-execute.html\" target=\"_blank\" rel=\"noopener\">m\u00e9todo<\/a> <code>execute<\/code> do nosso cursor e passando a consulta como argumento.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">delays_query = \"\"\"\n               SELECT AirportCode,\n                      SUM(FlightsDelayed) AS TotalDelayed\n                   FROM airlines\n                   WHERE TimeYear = 2016\n                   GROUP BY AirportCode\n                   HAVING SUM(FlightsDelayed) &gt; 500;\n              \"\"\"\n\nmysql_db_cursor.execute(delays_query)<\/pre>\n<p>Em seguida, recuperamos o resultado usando o <a href=\"https:\/\/dev.mysql.com\/doc\/connector-python\/en\/connector-python-api-mysqlcursor-fetchall.html\" target=\"_blank\" rel=\"noopener\">m\u00e9todo<\/a> <code>fetchall<\/code> do cursor.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">mysql_delays_list = mysql_db_cursor.fetchall()<\/pre>\n<p>No entanto, temos um problema nesse ponto: <code>fetchall<\/code> retorna os dados como uma lista. Para us\u00e1-la em pandas, podemos pass\u00e1-la para um DataFrame, mas perderemos os nomes de coluna, que precisar\u00e3o ser especificados manualmente quando quisermos criar o DataFrame.<\/p>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-316999\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2023\/01\/mysql-7-connector-without-column-names.png\" alt=\"\" width=\"2106\" height=\"1200\" \/><\/figure>\n<\/div>\n<p>Felizmente, pandas oferece uma solu\u00e7\u00e3o melhor. Em vez de criar um cursor, podemos ler nossa consulta em um DataFrame numa \u00fanica etapa, usando o m\u00e9todo <a href=\"https:\/\/pandas.pydata.org\/docs\/reference\/api\/pandas.read_sql.html\" target=\"_blank\" rel=\"noopener\">method<\/a> <code>read_sql<\/code>.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">mysql_delays_df2 = pd.read_sql(delays_query, con=mysql_db_connector)<\/pre>\n<p>Precisamos simplesmente passar nossa consulta e conector como argumentos para ler os dados do banco de dados MySQL. Olhando para nosso dataframe, podemos ver que temos exatamente os mesmos resultados acima, mas, desta vez, nossos nomes de coluna foram preservados.<\/p>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-317010\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2023\/01\/mysql-8-connector-with-column-names.png\" alt=\"\" width=\"2110\" height=\"794\" \/><\/figure>\n<\/div>\n<p>Um bom recurso que voc\u00ea deve ter percebido \u00e9 que o PyCharm aplica realce de sintaxe \u00e0 consulta SQL, mesmo quando ela est\u00e1 contida numa string Python. Abordaremos outra maneira pela qual o PyCharm permite que voc\u00ea trabalhe com o SQL mais adiante nesta postagem de blog.<\/p>\n<h2>Lendo os dados com o uso do SQLAlchemy<\/h2>\n<p>Uma alternativa para usar o MySQL Connector \u00e9 usar um pacote chamado <a href=\"https:\/\/www.sqlalchemy.org\/\" target=\"_blank\" rel=\"noopener\">SQLAlchemy<\/a>. Esse pacote oferece um m\u00e9todo \u00fanico para conectar-se a uma variedade de bancos de dados diferentes, incluindo o MySQL. Uma das coisas boas sobre o uso do SQLAlchemy \u00e9 que a sintaxe para consultar diferentes tipos de banco de dados permanece consistente entre os tipos de banco de dados, evitando que voc\u00ea se tenha que se lembrar de v\u00e1rios comandos diferentes se estiver trabalhando com muitos bancos de dados diferentes.<\/p>\n<p>Para come\u00e7ar, precisamos instalar o SQLAlchemy a partir do <a href=\"https:\/\/pypi.org\/project\/SQLAlchemy\/\" target=\"_blank\" rel=\"noopener\">PyPI<\/a> ou <a href=\"https:\/\/anaconda.org\/anaconda\/sqlalchemy\" target=\"_blank\" rel=\"noopener\">Anaconda<\/a>. Em seguida, importamos o m\u00e9todo <code>create_engine<\/code> e, \u00e9 claro, pandas.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import pandas as pd\nfrom sqlalchemy import create_engine<\/pre>\n<p>Agora, precisamos criar nosso <a href=\"https:\/\/docs.sqlalchemy.org\/en\/20\/core\/engines.html\" target=\"_blank\" rel=\"noopener\">mecanismo<\/a>. O mecanismo nos permite dizer ao pandas qual dialeto SQL estamos usando (no nosso caso, o MySQL) e fornecer as credenciais necess\u00e1rias para acessar nosso banco de dados. Tudo isso \u00e9 passado como uma string, na forma de <code>[dialect]:\/\/[user]:[password]@[host]\/[database]<\/code>. Vejamos como fica usando nosso banco de dados MySQL:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">mysql_engine = create_engine(\"mysql+mysqlconnector:\/\/pycharm:pycharm@localhost\/demo\")<\/pre>\n<p>Com isto criado, basta usar <code>read_sql<\/code> novamente, desta vez passando o mecanismo para o argumento <code>con<\/code>:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">mysql_delays_df3 = pd.read_sql(delays_query, con=mysql_engine)<\/pre>\n<p>Como voc\u00ea pode ver, obtemos o mesmo resultado ao usar <code>read_sql<\/code> com o MySQL Connector.<\/p>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-317021\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2023\/01\/mysql-9-sql-alchemy-table.png\" alt=\"\" width=\"2088\" height=\"730\" \/><\/figure>\n<\/div>\n<h2>Op\u00e7\u00f5es avan\u00e7adas para trabalhar com bancos de dados<\/h2>\n<p>Esses m\u00e9todos de conector s\u00e3o muito bons para extrair uma consulta que j\u00e1 sabemos que queremos. Mas, e se quisermos ter uma pr\u00e9via de como ser\u00e3o nossos dados antes de executar a consulta completa ou ter uma ideia de quanto tempo toda a consulta levar\u00e1? O PyCharm est\u00e1 de volta com alguns recursos avan\u00e7ados para trabalhar com bancos de dados.<\/p>\n<p>Se navegarmos de volta para a janela de ferramentas <em>Database<\/em> e clicarmos com o bot\u00e3o direito do mouse em nosso banco de dados, veremos que, em <em>New<\/em>, temos a op\u00e7\u00e3o de criar um console de consulta em <em>Query Console<\/em>.<\/p>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-317032\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2023\/01\/mysql-10-new-query-console.png\" alt=\"\" width=\"1206\" height=\"1468\" \/><\/figure>\n<\/div>\n<p>Isso nos permite abrir um console que podemos usar para consultar o banco de dados em SQL nativo. A janela do console inclui complementa\u00e7\u00e3o e introspec\u00e7\u00e3o de c\u00f3digo SQL, oferecendo uma maneira mais f\u00e1cil de criar suas consultas antes de repass\u00e1-las para os pacotes de conectores em Python.<\/p>\n<p>Realce sua consulta e clique no bot\u00e3o <em>Execute<\/em> no canto superior esquerdo.<\/p>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-317044\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2023\/01\/mysql-11-execute-from-console.png\" alt=\"\" width=\"1310\" height=\"848\" \/><\/figure>\n<\/div>\n<p>Isto recuperar\u00e1 os resultados da nossa consulta na aba <em>Services<\/em>, onde ela pode ser <a href=\"https:\/\/www.jetbrains.com\/help\/pycharm\/viewing-query-results.html\" target=\"_blank\" rel=\"noopener\">inspecionada ou exportada<\/a>. Uma coisa boa sobre a execu\u00e7\u00e3o de consultas no console \u00e9 que apenas as primeiras 500 linhas s\u00e3o inicialmente recuperadas do banco de dados, o que significa que voc\u00ea pode ter uma no\u00e7\u00e3o dos resultados de consultas maiores sem o compromisso de extrair todos os dados. Voc\u00ea pode ajustar o n\u00famero de linhas recuperadas acessando <em>Settings\/Preferences | Tools | Database | Data Editor and Viewer<\/em> e alterando o valor em <em>Limit page size to:<\/em>.<\/p>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-317055\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2023\/01\/mysql-12-results-of-query.png\" alt=\"\" width=\"1960\" height=\"740\" \/><\/figure>\n<\/div>\n<p>Falando em consultas grandes, tamb\u00e9m podemos ter uma no\u00e7\u00e3o de quanto tempo nossa consulta levar\u00e1, gerando um <a href=\"https:\/\/www.jetbrains.com\/help\/pycharm\/visualize-execution-plan.html\" target=\"_blank\" rel=\"noopener\">plano de execu\u00e7\u00e3o<\/a>. Se real\u00e7armos nossa consulta novamente e clicarmos com o bot\u00e3o direito do mouse, poderemos selecionar <em>Explain Plan<\/em> | <em>Explain Analyse<\/em> no menu. Isto gerar\u00e1 um plano de execu\u00e7\u00e3o para a nossa consulta, mostrando cada etapa que o planejador de consulta est\u00e1 realizando para recuperar nossos resultados. Planos de execu\u00e7\u00e3o s\u00e3o um tema por si s\u00f3, e n\u00e3o precisamos realmente entender tudo o que nosso plano est\u00e1 nos dizendo. Mais relevante para nossos prop\u00f3sitos \u00e9 a coluna <em>Actual Total Time<\/em>, onde podemos ver quanto tempo levar\u00e1 para retornar todas as linhas em cada etapa. Isto nos d\u00e1 uma boa estimativa do tempo geral da consulta, bem como se alguma parte de nossa consulta provavelmente consumir\u00e1 muito tempo.<\/p>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-317066\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2023\/01\/mysql-13-execution-plan.png\" alt=\"\" width=\"2096\" height=\"742\" \/><\/figure>\n<\/div>\n<p>Voc\u00ea tamb\u00e9m pode visualizar a execu\u00e7\u00e3o clicando no bot\u00e3o <em>Show Visualization<\/em>, \u00e0 esquerda do painel <em>Plan<\/em>.<\/p>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-317077\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2023\/01\/mysql-14-show-visualisation-button.png\" alt=\"\" width=\"666\" height=\"400\" \/><\/figure>\n<\/div>\n<p>Isto exibir\u00e1 um fluxograma que torna um pouco mais f\u00e1cil navegar pelas etapas que o planejador de consulta est\u00e1 executando.<\/p>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-317088\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2023\/01\/mysql-15-execution-plan-flowchart.png\" alt=\"\" width=\"1646\" height=\"1152\" \/><\/figure>\n<\/div>\n<p>Obter dados de bancos de dados MySQL em DataFrames pandas \u00e9 simples, e o PyCharm possui v\u00e1rias ferramentas poderosas para facilitar o trabalho com bancos de dados MySQL. Na pr\u00f3xima postagem do blog, veremos como usar o PyCharm para ler dados em pandas de outro tipo de banco de dados popular: bancos de dados PostgreSQL.<\/p>\n<p><em>Artigo original em ingl\u00eas por:<\/em><\/p>\n\n    <div class=\"about-author \">\n        <div class=\"about-author__box\">\n            <div class=\"row\">\n                <div class=\"about-author__box-img\">\n                    <img decoding=\"async\" src=\"https:\/\/secure.gravatar.com\/avatar\/?s=200&#038;r=g\" width=\"200\" height=\"200\" alt=\"\" loading=\"lazy\"  class=\"avatar avatar-200 wp-user-avatar wp-user-avatar-200 photo avatar-default\">\n                <\/div>\n                <div class=\"about-author__box-text\">\n                                                        <\/div>\n            <\/div>\n        <\/div>\n    <\/div>\n","protected":false},"author":1086,"featured_media":320796,"comment_status":"closed","ping_status":"closed","template":"","categories":[6943,952,1401,5108,2347],"tags":[2934,731,7057,1176,566],"cross-post-tag":[],"acf":[],"_links":{"self":[{"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/pycharm\/335975"}],"collection":[{"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/pycharm"}],"about":[{"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/types\/pycharm"}],"author":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/users\/1086"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/comments?post=335975"}],"version-history":[{"count":6,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/pycharm\/335975\/revisions"}],"predecessor-version":[{"id":335986,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/pycharm\/335975\/revisions\/335986"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/media\/320796"}],"wp:attachment":[{"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/media?parent=335975"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/categories?post=335975"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/tags?post=335975"},{"taxonomy":"cross-post-tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/cross-post-tag?post=335975"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}