{"id":329579,"date":"2023-03-06T15:12:12","date_gmt":"2023-03-06T14:12:12","guid":{"rendered":"https:\/\/blog.jetbrains.com\/?post_type=pycharm&#038;p=329579"},"modified":"2023-03-09T18:19:35","modified_gmt":"2023-03-09T17:19:35","slug":"utiliser-pycharm-pour-lire-les-donnees-d-une-base-de-donnees-mysql-dans-des-pandas","status":"publish","type":"pycharm","link":"https:\/\/blog.jetbrains.com\/fr\/pycharm\/2023\/03\/utiliser-pycharm-pour-lire-les-donnees-d-une-base-de-donnees-mysql-dans-des-pandas\/","title":{"rendered":"Utiliser PyCharm pour lire les donn\u00e9es d&#8217;une base de donn\u00e9es MySQL dans des pandas"},"content":{"rendered":"<p>Passer de la lecture d&#8217;un fichier CSV stock\u00e9 localement dans des pandas \u00e0 la connexion\u00a0 \u00e0 une base de donn\u00e9es pour l&#8217;interroger peut s&#8217;av\u00e9rer complexe. Dans cet article, nous expliquons comment lire des donn\u00e9es stock\u00e9es dans une base de donn\u00e9es MySQL dans des pandas et pr\u00e9sentons plusieurs fonctionnalit\u00e9s de PyCharm qui facilitent la r\u00e9alisation de ce type de t\u00e2che.<\/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>Visualiser le contenu de la base de donn\u00e9es<\/h2>\n<p>Dans ce tutoriel, nous allons lire des donn\u00e9es concernant les retards et les annulations de vols de compagnies a\u00e9riennes \u00e0 partir d&#8217;une base de donn\u00e9es MySQL dans un DataFrame pandas. Ces donn\u00e9es sont une version de l&#8217;ensemble de donn\u00e9es <a href=\"https:\/\/www.kaggle.com\/datasets\/priankravichandar\/airline-delays-from-20032016\" target=\"_blank\" rel=\"noopener\">\u201cAirline Delays from 2003-2016\u201d<\/a> de <a href=\"https:\/\/www.kaggle.com\/priankravichandar\" target=\"_blank\" rel=\"noopener\">Priank Ravichandar<\/a> sous licence <a href=\"https:\/\/creativecommons.org\/publicdomain\/zero\/1.0\/\" target=\"_blank\" rel=\"noopener\">CC0 1.0<\/a>.<\/p>\n<p>Lorsque l&#8217;on travaille avec des bases de donn\u00e9es, l&#8217;un des points les plus frustrants est de ne pas avoir de vue d&#8217;ensemble des donn\u00e9es disponibles, les tables \u00e9tant stock\u00e9es sur un serveur distant. La premi\u00e8re fonctionnalit\u00e9 de PyCharm que nous allons utiliser est la fen\u00eatre d&#8217;outils <em>Database<\/em>, qui permet de se connecter \u00e0 une base de donn\u00e9es et de r\u00e9aliser une introspection compl\u00e8te avant d&#8217;effectuer toute requ\u00eate.<\/p>\n<p>Pour se connecter \u00e0 notre base de donn\u00e9es MySQL, il faut tout d&#8217;abord cliquer sur la fen\u00eatre d&#8217;outils <em>Database<\/em> situ\u00e9e sur \u00e0 droite dans PyCharm.<\/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>En haut \u00e0 gauche de cette fen\u00eatre, vous verrez un bouton plus. Cliquez sur ce bouton pour afficher la boite de dialogue avec menu d\u00e9roulant et s\u00e9lectionnez <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>Cette fen\u00eatre contextuelle nous permet de nous connecter \u00e0 notre base de donn\u00e9es MySQL. Dans le cas pr\u00e9sent, nous utilisons une base de donn\u00e9es h\u00e9berg\u00e9e localement et conservons donc <em>Host<\/em> en tant que \u00ab\u00a0localhost\u00a0\u00bb et <em>Port<\/em> comme port MySQL par d\u00e9faut de \u00ab\u00a03306\u00a0\u00bb. Nous utilisons l&#8217;option d&#8217;<em>authentification<\/em> \u00ab\u00a0User &amp; Password\u00a0\u00bb et saisissons \u00ab\u00a0pycharm\u00a0\u00bb dans le champ <em>User<\/em> et comme dans le champ <em>Password<\/em>. Puis, nous attribuons le nom \u00ab\u00a0demo\u00a0\u00bb \u00e0 notre <em>Database<\/em>. Bien entendu, pour vous connecter \u00e0 votre propre base de donn\u00e9es MySQL, vous aurez besoin de l&#8217;h\u00f4te sp\u00e9cifique, du nom de la base de donn\u00e9es, de votre nom d&#8217;utilisateur et de votre mot de passe. Consultez <a href=\"https:\/\/www.jetbrains.com\/help\/pycharm\/mysql.html\" target=\"_blank\" rel=\"noopener\">la documentation<\/a> pour voir l&#8217;ensemble des options de connexion.<\/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>Ensuite, cliquez sur <em>Test Connection<\/em>. PyCharm nous indique que les fichiers du pilote ne sont pas install\u00e9s. Continuez et cliquez sur <em>Download Driver Files<\/em>. La fen\u00eatre d&#8217;outils <em>Database<\/em> fournit une fonctionnalit\u00e9 qui trouve et installe automatiquement le pilote requis \u00e0 notre place.<\/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>Et voil\u00e0\u00a0! Nous sommes maintenant connect\u00e9s \u00e0 notre base de donn\u00e9es. Nous pouvons aller dans l&#8217;onglet <em>Schemas<\/em> et s\u00e9lectionner les sch\u00e9mas que nous voulons introspecter. Dans notre exemple de base de donn\u00e9es, il n&#8217;y en a qu&#8217;un (\u00ab\u00a0demo\u00a0\u00bb), mais si vous travaillez avec de tr\u00e8s grandes bases de donn\u00e9es, vous pouvez gagner du temps en limitant l&#8217;introspection aux sch\u00e9mas pertinents.<\/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>Ceci fait, nous sommes pr\u00eats \u00e0 nous connecter \u00e0 notre base de donn\u00e9es. Cliquez sur <em>OK<\/em> et attendez quelques secondes. Vous verrez alors que l&#8217;introspection a \u00e9t\u00e9 effectu\u00e9e pour l&#8217;int\u00e9gralit\u00e9 de notre base de donn\u00e9es, jusqu&#8217;au niveau des champs de tables et de leurs types. Nous disposons ainsi d&#8217;une vue d&#8217;ensemble de ce qui se trouve dans la base de donn\u00e9es avant d&#8217;ex\u00e9cuter une requ\u00eate.<\/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>Lire les donn\u00e9es avec MySQL Connector<\/h2>\n<p>Maintenant que nous savons ce que contient notre base de donn\u00e9es, nous sommes pr\u00eats \u00e0 effectuer une requ\u00eate. Disons que nous voulons voir quels a\u00e9roports ont eu au moins 500 vols retard\u00e9s en 2016. En examinant les champs de la table introspect\u00e9e <code>airlines<\/code>, nous voyons que ces donn\u00e9es peuvent \u00eatre obtenues avec la requ\u00eate suivante\u00a0:<\/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>La premi\u00e8re fa\u00e7on dont nous pouvons ex\u00e9cuter cette requ\u00eate avec Python consiste \u00e0 utiliser un paquet appel\u00e9 MySQL Connector, qui peut \u00eatre install\u00e9 depuis <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>. Consultez la documentation correspondante si vous avez besoin de conseils pour configurer les environnements <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 pour <a href=\"https:\/\/www.jetbrains.com\/help\/pycharm\/installing-uninstalling-and-upgrading-packages.html\" target=\"_blank\" rel=\"noopener\">installer des d\u00e9pendances<\/a>. Une fois l&#8217;installation termin\u00e9e, nous ouvrons un <a href=\"https:\/\/www.jetbrains.com\/help\/pycharm\/jupyter-notebook-support.html#get-started\" target=\"_blank\" rel=\"noopener\">nouveau notebook Jupyter<\/a> et importons le connecteur MySQL et les biblioth\u00e8ques 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>Pour lire les donn\u00e9es de notre base, nous devons cr\u00e9er un <a href=\"https:\/\/dev.mysql.com\/doc\/connector-python\/en\/connector-python-connecting.html\" target=\"_blank\" rel=\"noopener\">connector<\/a>. Pour ce faire, nous utilisons la m\u00e9thode <code>connect<\/code>, \u00e0 laquelle nous transmettons les informations d&#8217;identification n\u00e9cessaires pour acc\u00e9der \u00e0 la base de donn\u00e9es\u00a0: <code>host<\/code>, <code>database<\/code>, <code>user<\/code> et <code>password<\/code>. Ce sont les m\u00eames informations d&#8217;identification que celles que nous avons utilis\u00e9es pr\u00e9c\u00e9demment pour acc\u00e9der \u00e0 la base de donn\u00e9es avec la fen\u00eatre d&#8217;outils <em>Database<\/em>.<\/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>Nous devons maintenant cr\u00e9er un <a href=\"https:\/\/dev.mysql.com\/doc\/connector-python\/en\/connector-python-api-mysqlcursor.html\" target=\"_blank\" rel=\"noopener\">curseur<\/a>. Il servira pour l&#8217;ex\u00e9cution de nos requ\u00eates SQL dans la base de donn\u00e9es et utilise les informations d&#8217;identification sp\u00e9cifi\u00e9es dans notre connecteur pour obtenir l&#8217;acc\u00e8s.<\/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>Nous sommes maintenant pr\u00eats \u00e0 ex\u00e9cuter notre requ\u00eate. Pour ce faire, nous utilisons la <a href=\"https:\/\/dev.mysql.com\/doc\/connector-python\/en\/connector-python-api-mysqlcursor-execute.html\" target=\"_blank\" rel=\"noopener\">m\u00e9thode<\/a> <code>execute<\/code> du curseur et en transmettant la requ\u00eate comme argument.<\/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>Nous r\u00e9cup\u00e9rons ensuite le r\u00e9sultat en utilisant la <a href=\"https:\/\/dev.mysql.com\/doc\/connector-python\/en\/connector-python-api-mysqlcursor-fetchall.html\" target=\"_blank\" rel=\"noopener\">m\u00e9thode<\/a> <code>fetchall<\/code> du curseur.<\/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>Cependant, un probl\u00e8me survient \u00e0 ce stade\u00a0: <code>fetchall<\/code> restitue les donn\u00e9es sous forme de liste. Pour le lire dans pandas, nous pouvons le passer dans un DataFrame, mais les noms de nos colonnes seront perdus et il faudra les sp\u00e9cifier manuellement lors de la cr\u00e9ation du 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>Heureusement, pandas offre une meilleure solution. Plut\u00f4t que de cr\u00e9er un curseur, nous pouvons lire notre requ\u00eate dans un DataFrame en une seule \u00e9tape, en utilisant la <a href=\"https:\/\/pandas.pydata.org\/docs\/reference\/api\/pandas.read_sql.html\" target=\"_blank\" rel=\"noopener\">m\u00e9thode<\/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>Il nous suffit de passer notre requ\u00eate et notre connecteur en arguments pour lire les donn\u00e9es de la base de donn\u00e9es MySQL. En examinant notre dataframe, nous pouvons voir que nous avons exactement les m\u00eames r\u00e9sultats que ci-dessus, mais que les noms de nos colonnes ont \u00e9t\u00e9 pr\u00e9serv\u00e9s cette fois-ci.<\/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>Vous avez peut-\u00eatre remarqu\u00e9 que PyCharm applique la mise en \u00e9vidence de la syntaxe \u00e0 la requ\u00eate SQL, m\u00eame lorsqu&#8217;elle est contenue dans une cha\u00eene Python. Nous verrons une autre fa\u00e7on de travailler avec SQL avec l&#8217;aide de PyCharm plus loin dans cet article.<\/p>\n<h2>Lire les donn\u00e9es avec SQLAlchemy<\/h2>\n<p>Il est \u00e9galement possible d&#8217;utiliser un paquet appel\u00e9 <a href=\"https:\/\/www.sqlalchemy.org\/\" target=\"_blank\" rel=\"noopener\">SQLAlchemy<\/a> \u00e0 la place de MySQL Connector. Ce paquet offre une m\u00e9thode unique pour se connecter \u00e0 diff\u00e9rentes bases de donn\u00e9es, parmi lesquelles MySQL. L&#8217;un des avantages de SQLAlchemy est que la syntaxe des requ\u00eates reste similaire d&#8217;un type de base de donn\u00e9es \u00e0 l&#8217;autre, ce qui \u00e9vite d&#8217;avoir \u00e0 se souvenir de toutes les commandes multiples si vous travaillez avec un grand nombre de bases de donn\u00e9es diff\u00e9rentes.<\/p>\n<p>Pour commencer, nous devons installer SQLAlchemy depuis <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>. Nous importons ensuite la m\u00e9thode <code>create_engine<\/code>, et bien s\u00fbr, les 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>Nous devons maintenant cr\u00e9er notre <a href=\"https:\/\/docs.sqlalchemy.org\/en\/20\/core\/engines.html\" target=\"_blank\" rel=\"noopener\">moteur<\/a>. Le moteur permet d&#8217;indiquer \u00e0 pandas quel dialecte SQL nous utilisons (dans notre cas, MySQL) et de lui fournir les informations d&#8217;identification dont il a besoin pour acc\u00e9der \u00e0 notre base de donn\u00e9es. Tout ceci est pass\u00e9 en tant que cha\u00eene, sous la forme : <code>[dialect]:\/\/[user]:[password]@[host]\/[database]<\/code>. Voyons \u00e0 quoi cela ressemble avec notre base de donn\u00e9es MySQL\u00a0:<\/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>Une fois cr\u00e9\u00e9e, il nous suffit d&#8217;utiliser \u00e0 nouveau <code>read_sql<\/code>, en transmettant cette fois le moteur \u00e0 l&#8217;argument <code>con<\/code>\u00a0:<\/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>Comme vous pouvez le voir, nous obtenons le m\u00eame r\u00e9sultat qu&#8217;en utilisant <code>read_sql<\/code> avec 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>Options avanc\u00e9es pour travailler avec les bases de donn\u00e9es<\/h2>\n<p>Ces m\u00e9thodes de connexion sont tr\u00e8s efficaces pour extraire une requ\u00eate que nous connaissons d\u00e9j\u00e0, mais qu&#8217;en est-il si nous voulons avoir un aper\u00e7u de ce \u00e0 quoi ressembleront nos donn\u00e9es avant d&#8217;ex\u00e9cuter la requ\u00eate compl\u00e8te ou une estimation du temps que prendra la requ\u00eate\u00a0? L\u00e0 encore, PyCharm fournit plusieurs fonctionnalit\u00e9s avanc\u00e9es qui peuvent nous aider.<\/p>\n<p>En revenant \u00e0 la fen\u00eatre d&#8217;outils <em>Database<\/em>, si on fait un clic doit sur la base de donn\u00e9es on peut voir une option situ\u00e9e sous <em>New<\/em> qui permet de cr\u00e9er une <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>Nous pouvons alors ouvrir une console et l&#8217;utiliser pour interroger la base de donn\u00e9es en SQL natif. La fen\u00eatre de la console fournit la saisie semi-automatique du code SQL et l&#8217;introspection, ce qui facilite la cr\u00e9ation de vos requ\u00eates avant de les transmettre aux paquets de connecteurs en Python.<\/p>\n<p>Mettez votre requ\u00eate en \u00e9vidence et cliquez sur le bouton <em>Execute<\/em> dans le coin sup\u00e9rieur gauche.<\/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>Cela permettra de retrouver les r\u00e9sultats de notre requ\u00eate dans l&#8217;onglet <em>Services<\/em>, o\u00f9 ils pourront \u00eatre <a href=\"https:\/\/www.jetbrains.com\/help\/pycharm\/viewing-query-results.html\" target=\"_blank\" rel=\"noopener\">inspect\u00e9s ou export\u00e9s<\/a>. L&#8217;un des avantages de l&#8217;ex\u00e9cution de requ\u00eates dans la console est que seules les 500 premi\u00e8res lignes sont initialement extraites de la base de donn\u00e9es, ce qui permet de se faire une id\u00e9e des r\u00e9sultats de requ\u00eates plus importantes sans avoir \u00e0 extraire toutes les donn\u00e9es. Vous pouvez ajuster le nombre de lignes r\u00e9cup\u00e9r\u00e9es dans <em>Settings\/Preferences | Tools | Database | Data Editor and Viewer<\/em>, en modifiant la valeur sous <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>Nous pouvons \u00e9galement obtenir une estimation du temps que prendra notre requ\u00eate en g\u00e9n\u00e9rant un <a href=\"https:\/\/www.jetbrains.com\/help\/pycharm\/visualize-execution-plan.html\" target=\"_blank\" rel=\"noopener\">plan d&#8217;ex\u00e9cution<\/a>. En mettant \u00e0 nouveau notre requ\u00eate en surbrillance, puis en effectuant un clic droit, nous pouvons s\u00e9lectionner <em>Explain Plan<\/em> | <em>Explain Analyse<\/em> dans le menu. Cela va g\u00e9n\u00e9rer un plan d&#8217;ex\u00e9cution pour notre requ\u00eate, montrant chaque \u00e9tape que le planificateur de requ\u00eates effectue pour r\u00e9cup\u00e9rer nos r\u00e9sultats. Les plans d&#8217;ex\u00e9cution constituent un sujet \u00e0 part enti\u00e8re, mais en l&#8217;occurrence, il n&#8217;est pas vraiment n\u00e9cessaire de comprendre tout ce que notre plan indique. Dans notre cas, la colonne la plus pertinente est <em>Actual Total Time<\/em>, car elle nous permet de voir combien de temps il faudra pour renvoyer toutes les lignes \u00e0 chaque \u00e9tape. Cela nous donne une bonne estimation de la dur\u00e9e totale de la requ\u00eate et nous permet de savoir si certaines parties de notre requ\u00eate sont susceptibles de prendre beaucoup de temps.<\/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>Vous pouvez \u00e9galement visualiser l&#8217;ex\u00e9cution en cliquant sur le bouton <em>Show Visualization<\/em> \u00e0 gauche du panneau <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>Cela permet d&#8217;obtenir un organigramme qui facilite la navigation \u00e0 travers les \u00e9tapes du planificateur de requ\u00eates.<\/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>Importer des donn\u00e9es de MySQL dans des DataFrames pandas est assez simple et PyCharm dispose de nombreux outils qui facilitent le travail avec les bases de donn\u00e9es MySQL. Dans le prochain article de cette s\u00e9rie, nous verrons comment utiliser PyCharm pour lire des donn\u00e9es dans pandas \u00e0 partir de bases de donn\u00e9es PostgreSQL.<\/p>\n\n\n<p><em>Article original en anglais de<\/em> :<\/p>\n\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":813,"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\/fr\/wp-json\/wp\/v2\/pycharm\/329579"}],"collection":[{"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/pycharm"}],"about":[{"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/types\/pycharm"}],"author":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/users\/813"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/comments?post=329579"}],"version-history":[{"count":10,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/pycharm\/329579\/revisions"}],"predecessor-version":[{"id":331603,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/pycharm\/329579\/revisions\/331603"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/media\/320796"}],"wp:attachment":[{"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/media?parent=329579"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/categories?post=329579"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/tags?post=329579"},{"taxonomy":"cross-post-tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/cross-post-tag?post=329579"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}