diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..e0195e846372483252668e49cbcb0fc05edae82f --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +mocodo_notebook +.ipynb_checkpoints diff --git a/SQL sandbox.ipynb b/SQL sandbox.ipynb new file mode 100644 index 0000000000000000000000000000000000000000..2b57f36659930c6ecd2f9db7b2a9d3830ef2cf07 --- /dev/null +++ b/SQL sandbox.ipynb @@ -0,0 +1,815 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "9ea52343-cc9d-4b99-9da9-6fdab656e9f1", + "metadata": {}, + "source": [ + "# SGBDR avec PostgreSQL dans un notebook\n", + "Ce notebook est une première ébacuhe pour tester ce qu'il est possible de faire pour apprendre les bases de données relationnelles en utilisant des notebooks Jupyter." + ] + }, + { + "cell_type": "markdown", + "id": "106e64f2-2480-406a-9a8b-69759603c37a", + "metadata": {}, + "source": [ + "## Modélisation \n", + "\n", + "### MEA\n", + "Un MEA peut etre réalisé simplement avec [MoCoDo](https://rawgit.com/laowantong/mocodo/master/doc/fr_refman.html).\n", + "Cet outils permet entre autres de générer à partir d'une description textuelle, le schéma, le passage vers le modèle relationnel (relations, diagramme des tables et script de création)." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "cf6ab1d7-a631-4e6e-8423-76d0fe89346e", + "metadata": {}, + "outputs": [], + "source": [ + "%reload_ext mocodo_magic" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "03b3dec1-10c1-4018-88e0-9c0c750d8b60", + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:link=\"http://www.w3.org/1999/xlink\" width=\"364\" height=\"200\" view_box=\"0 0 364 200\">\n", + "\n", + "<desc>Generated by Mocodo 2.3.9 on Fri, 22 Oct 2021 09:12:50</desc>\n", + "\n", + "<rect id=\"frame\" x=\"0\" y=\"0\" width=\"364\" height=\"200\" fill=\"none\" stroke=\"none\" stroke-width=\"0\"/>\n", + "\n", + "<!-- Association INCLURE -->\n", + "<line x1=\"316\" y1=\"44\" x2=\"203\" y2=\"44\" stroke=\"#000000\" stroke-width=\"1\"/>\n", + "<text x=\"249\" y=\"36.0\" fill=\"#000000\" font-family=\"Courier New\" font-size=\"12\">1,N</text>\n", + "<line x1=\"69\" y1=\"44\" x2=\"203\" y2=\"44\" stroke=\"#000000\" stroke-width=\"1\"/>\n", + "<text x=\"134\" y=\"60.0\" fill=\"#000000\" font-family=\"Courier New\" font-size=\"12\">0,N</text>\n", + "<g id=\"association-INCLURE\">\n", + "\t<path d=\"M 230 18 a 14 14 90 0 1 14 14 V 44 h -82 V 32 a 14 14 90 0 1 14 -14\" fill=\"#FFFFFF\" stroke=\"#FFFFFF\" stroke-width=\"0\"/>\n", + "\t<path d=\"M 244 44.0 v 12 a 14 14 90 0 1 -14 14 H 176 a 14 14 90 0 1 -14 -14 V 44.0 H 82\" fill=\"#FFFFFF\" stroke=\"#FFFFFF\" stroke-width=\"0\"/>\n", + "\t<rect x=\"162\" y=\"18\" width=\"82\" height=\"52\" fill=\"none\" rx=\"14\" stroke=\"#000000\" stroke-width=\"1.5\"/>\n", + "\t<line x1=\"162\" y1=\"44\" x2=\"244\" y2=\"44\" stroke=\"#000000\" stroke-width=\"1\"/>\n", + "\t<text x=\"173\" y=\"36.6\" fill=\"#000000\" font-family=\"Courier New\" font-size=\"14\">INCLURE</text>\n", + "\t<text x=\"169\" y=\"62.6\" fill=\"#000000\" font-family=\"Courier New\" font-size=\"14\">Quantité</text>\n", + "</g>\n", + "\n", + "<!-- Association PASSER -->\n", + "<line x1=\"69\" y1=\"147\" x2=\"203\" y2=\"147\" stroke=\"#000000\" stroke-width=\"1\"/>\n", + "<text x=\"105\" y=\"163.0\" fill=\"#000000\" font-family=\"Courier New\" font-size=\"12\">0,N</text>\n", + "<line x1=\"316\" y1=\"44\" x2=\"203\" y2=\"147\" stroke=\"#000000\" stroke-width=\"1\"/>\n", + "<text x=\"275.993404926436\" y=\"95\" fill=\"#000000\" font-family=\"Courier New\" font-size=\"12\">1,1</text>\n", + "<g id=\"association-PASSER\">\n", + "\t<path d=\"M 222 121 a 14 14 90 0 1 14 14 V 147 h -66 V 135 a 14 14 90 0 1 14 -14\" fill=\"#FFFFFF\" stroke=\"#FFFFFF\" stroke-width=\"0\"/>\n", + "\t<path d=\"M 236 147.0 v 12 a 14 14 90 0 1 -14 14 H 184 a 14 14 90 0 1 -14 -14 V 147.0 H 66\" fill=\"#FFFFFF\" stroke=\"#FFFFFF\" stroke-width=\"0\"/>\n", + "\t<rect x=\"170\" y=\"121\" width=\"66\" height=\"52\" fill=\"none\" rx=\"14\" stroke=\"#000000\" stroke-width=\"1.5\"/>\n", + "\t<line x1=\"170\" y1=\"147\" x2=\"236\" y2=\"147\" stroke=\"#000000\" stroke-width=\"1\"/>\n", + "\t<text x=\"177\" y=\"139.6\" fill=\"#000000\" font-family=\"Courier New\" font-size=\"14\">PASSER</text>\n", + "</g>\n", + "\n", + "<!-- Entity PRODUIT -->\n", + "<g id=\"entity-PRODUIT\">\n", + "\t<g id=\"frame-PRODUIT\">\n", + "\t\t<rect x=\"9\" y=\"9\" width=\"120\" height=\"26\" fill=\"#FFFFFF\" stroke=\"#FFFFFF\" stroke-width=\"0\"/>\n", + "\t\t<rect x=\"9\" y=\"35.0\" width=\"120\" height=\"44\" fill=\"#FFFFFF\" stroke=\"#FFFFFF\" stroke-width=\"0\"/>\n", + "\t\t<rect x=\"9\" y=\"9\" width=\"120\" height=\"70\" fill=\"none\" stroke=\"#000000\" stroke-width=\"1.5\"/>\n", + "\t\t<line x1=\"9\" y1=\"35\" x2=\"129\" y2=\"35\" stroke=\"#000000\" stroke-width=\"1\"/>\n", + "\t</g>\n", + "\t<text x=\"39\" y=\"27.6\" fill=\"#000000\" font-family=\"Courier New\" font-size=\"14\">PRODUIT</text>\n", + "\t<text x=\"14\" y=\"53.6\" fill=\"#000000\" font-family=\"Courier New\" font-size=\"14\">code</text>\n", + "\t<line x1=\"14\" y1=\"56.0\" x2=\"49\" y2=\"56.0\" stroke=\"#000000\" stroke-width=\"1\"/>\n", + "\t<text x=\"14\" y=\"71.6\" fill=\"#000000\" font-family=\"Courier New\" font-size=\"14\">prix_unitaire</text>\n", + "</g>\n", + "\n", + "<!-- Entity COMMANDE -->\n", + "<g id=\"entity-COMMANDE\">\n", + "\t<g id=\"frame-COMMANDE\">\n", + "\t\t<rect x=\"277\" y=\"9\" width=\"78\" height=\"26\" fill=\"#FFFFFF\" stroke=\"#FFFFFF\" stroke-width=\"0\"/>\n", + "\t\t<rect x=\"277\" y=\"35.0\" width=\"78\" height=\"44\" fill=\"#FFFFFF\" stroke=\"#FFFFFF\" stroke-width=\"0\"/>\n", + "\t\t<rect x=\"277\" y=\"9\" width=\"78\" height=\"70\" fill=\"none\" stroke=\"#000000\" stroke-width=\"1.5\"/>\n", + "\t\t<line x1=\"277\" y1=\"35\" x2=\"355\" y2=\"35\" stroke=\"#000000\" stroke-width=\"1\"/>\n", + "\t</g>\n", + "\t<text x=\"282\" y=\"27.6\" fill=\"#000000\" font-family=\"Courier New\" font-size=\"14\">COMMANDE</text>\n", + "\t<text x=\"282\" y=\"53.6\" fill=\"#000000\" font-family=\"Courier New\" font-size=\"14\">numero</text>\n", + "\t<line x1=\"282\" y1=\"56.0\" x2=\"334\" y2=\"56.0\" stroke=\"#000000\" stroke-width=\"1\"/>\n", + "\t<text x=\"282\" y=\"71.6\" fill=\"#000000\" font-family=\"Courier New\" font-size=\"14\">date</text>\n", + "</g>\n", + "\n", + "<!-- Entity CLIENT -->\n", + "<g id=\"entity-CLIENT\">\n", + "\t<g id=\"frame-CLIENT\">\n", + "\t\t<rect x=\"38\" y=\"103\" width=\"62\" height=\"26\" fill=\"#FFFFFF\" stroke=\"#FFFFFF\" stroke-width=\"0\"/>\n", + "\t\t<rect x=\"38\" y=\"129.0\" width=\"62\" height=\"62\" fill=\"#FFFFFF\" stroke=\"#FFFFFF\" stroke-width=\"0\"/>\n", + "\t\t<rect x=\"38\" y=\"103\" width=\"62\" height=\"88\" fill=\"none\" stroke=\"#000000\" stroke-width=\"1.5\"/>\n", + "\t\t<line x1=\"38\" y1=\"129\" x2=\"100\" y2=\"129\" stroke=\"#000000\" stroke-width=\"1\"/>\n", + "\t</g>\n", + "\t<text x=\"43\" y=\"121.6\" fill=\"#000000\" font-family=\"Courier New\" font-size=\"14\">CLIENT</text>\n", + "\t<text x=\"43\" y=\"147.6\" fill=\"#000000\" font-family=\"Courier New\" font-size=\"14\">email</text>\n", + "\t<line x1=\"43\" y1=\"150.0\" x2=\"86\" y2=\"150.0\" stroke=\"#000000\" stroke-width=\"1\"/>\n", + "\t<text x=\"43\" y=\"165.6\" fill=\"#000000\" font-family=\"Courier New\" font-size=\"14\">nom</text>\n", + "\t<text x=\"43\" y=\"183.6\" fill=\"#000000\" font-family=\"Courier New\" font-size=\"14\">prenom</text>\n", + "</g>\n", + "</svg>" + ], + "text/plain": [ + "<IPython.core.display.SVG object>" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "<html>\n", + "<head>\n", + "<meta charset='utf-8'>\n", + "<style>\n", + " #mld .relation { font-variant: small-caps; font-weight: bold }\n", + " #mld .primary { text-decoration: underline }\n", + " #mld .foreign { font-style: oblique }\n", + " #mld .normal { }\n", + "</style>\n", + "</head>\n", + "<body>\n", + "<div id='mld'>\n", + "<div>\n", + " <span class='relation'>PRODUIT</span> (\n", + " <span class='primary'>code</span>,\n", + " <span class='normal'>prix_unitaire</span>\n", + " )\n", + "</div>\n", + "<div>\n", + " <span class='relation'>INCLURE</span> (\n", + " <span class='foreign primary'>numero</span>,\n", + " <span class='foreign primary'>code</span>,\n", + " <span class='normal'>Quantité</span>\n", + " )\n", + "</div>\n", + "<div>\n", + " <span class='relation'>COMMANDE</span> (\n", + " <span class='primary'>numero</span>,\n", + " <span class='normal'>date</span>,\n", + " <span class='foreign'>email</span>\n", + " )\n", + "</div>\n", + "<div>\n", + " <span class='relation'>CLIENT</span> (\n", + " <span class='primary'>email</span>,\n", + " <span class='normal'>nom</span>,\n", + " <span class='normal'>prenom</span>\n", + " )\n", + "</div>\n", + "</div>\n", + "</body>\n", + "</html>" + ], + "text/plain": [ + "<IPython.core.display.HTML object>" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "%%mocodo --title=client_commande --mld --relations=postgresql\n", + "PRODUIT: code, prix_unitaire\n", + "INCLURE, 1N COMMANDE, 0N PRODUIT: Quantité \n", + "COMMANDE: numero, date\n", + " \n", + "CLIENT: email, nom, prenom\n", + "PASSER, 0N CLIENT, 11 COMMANDE " + ] + }, + { + "cell_type": "markdown", + "id": "685c0300-3bf6-4633-840d-6b068f2619ac", + "metadata": {}, + "source": [ + "Le script SQL est dans le fichier [mocodo_notebook/sandbox_postgresql.sql](mocodo_notebook/sandbox_postgresql.sql)." + ] + }, + { + "cell_type": "markdown", + "id": "c4723176-0684-4eec-ba60-d91597046d74", + "metadata": {}, + "source": [ + "### UML\n", + "Il est possible de construire simplement des diagrammes (dont UML) en utilisant [PlantUML](https://plantuml.com)." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "d9f7e6ac-7e6e-4870-8bdd-3f9620d6899d", + "metadata": {}, + "outputs": [], + "source": [ + "import iplantuml" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "82f26e33-c402-4a03-9d17-3878868b4a12", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" contentScriptType=\"application/ecmascript\" contentStyleType=\"text/css\" height=\"379px\" preserveAspectRatio=\"none\" style=\"width:420px;height:379px;background:#FFFFFF;\" version=\"1.1\" viewBox=\"0 0 420 379\" width=\"420px\" zoomAndPan=\"magnify\"><defs><filter height=\"300%\" id=\"ffz6n8r6r73x1\" width=\"300%\" x=\"-1\" y=\"-1\"><feGaussianBlur result=\"blurOut\" stdDeviation=\"2.0\"/><feColorMatrix in=\"blurOut\" result=\"blurOut2\" type=\"matrix\" values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 .4 0\"/><feOffset dx=\"4.0\" dy=\"4.0\" in=\"blurOut2\" result=\"blurOut3\"/><feBlend in=\"SourceGraphic\" in2=\"blurOut3\" mode=\"normal\"/></filter></defs><g><!--MD5=[67795369a0169a6ec527a79565ea23e1]\n", + "class Commande--><rect codeLine=\"1\" fill=\"#FEFECE\" filter=\"url(#ffz6n8r6r73x1)\" height=\"73.6094\" id=\"Commande\" style=\"stroke:#A80036;stroke-width:1.5;\" width=\"120\" x=\"7\" y=\"170\"/><ellipse cx=\"30.1\" cy=\"186\" fill=\"#ADD1B2\" rx=\"11\" ry=\"11\" style=\"stroke:#A80036;stroke-width:1.0;\"/><path d=\"M33.0688,191.6406 Q32.4906,191.9375 31.85,192.0781 Q31.2094,192.2344 30.5063,192.2344 Q28.0063,192.2344 26.6781,190.5938 Q25.3656,188.9375 25.3656,185.8125 Q25.3656,182.6875 26.6781,181.0313 Q28.0063,179.375 30.5063,179.375 Q31.2094,179.375 31.85,179.5313 Q32.5063,179.6875 33.0688,179.9844 L33.0688,182.7031 Q32.4438,182.125 31.85,181.8594 Q31.2563,181.5781 30.6313,181.5781 Q29.2875,181.5781 28.6,182.6563 Q27.9125,183.7188 27.9125,185.8125 Q27.9125,187.9063 28.6,188.9844 Q29.2875,190.0469 30.6313,190.0469 Q31.2563,190.0469 31.85,189.7813 Q32.4438,189.5 33.0688,188.9219 L33.0688,191.6406 Z \" fill=\"#000000\"/><text fill=\"#000000\" font-family=\"sans-serif\" font-size=\"12\" lengthAdjust=\"spacing\" textLength=\"70\" x=\"45.9\" y=\"190.1543\">Commande</text><line style=\"stroke:#A80036;stroke-width:1.5;\" x1=\"8\" x2=\"126\" y1=\"202\" y2=\"202\"/><rect fill=\"none\" height=\"6\" style=\"stroke:#C82930;stroke-width:1.0;\" width=\"6\" x=\"15\" y=\"210\"/><text fill=\"#000000\" font-family=\"sans-serif\" font-size=\"11\" lengthAdjust=\"spacing\" textLength=\"94\" x=\"27\" y=\"216.2104\">numero : Integer</text><rect fill=\"none\" height=\"6\" style=\"stroke:#C82930;stroke-width:1.0;\" width=\"6\" x=\"15\" y=\"222.8047\"/><text fill=\"#000000\" font-family=\"sans-serif\" font-size=\"11\" lengthAdjust=\"spacing\" textLength=\"61\" x=\"27\" y=\"229.0151\">date : Date</text><line style=\"stroke:#A80036;stroke-width:1.5;\" x1=\"8\" x2=\"126\" y1=\"235.6094\" y2=\"235.6094\"/><!--MD5=[67e1aed5c2f4d55f1a3a0cfbc189f220]\n", + "class Produit--><rect codeLine=\"5\" fill=\"#FEFECE\" filter=\"url(#ffz6n8r6r73x1)\" height=\"73.6094\" id=\"Produit\" style=\"stroke:#A80036;stroke-width:1.5;\" width=\"141\" x=\"265.5\" y=\"170\"/><ellipse cx=\"309.3\" cy=\"186\" fill=\"#ADD1B2\" rx=\"11\" ry=\"11\" style=\"stroke:#A80036;stroke-width:1.0;\"/><path d=\"M312.2688,191.6406 Q311.6906,191.9375 311.05,192.0781 Q310.4094,192.2344 309.7063,192.2344 Q307.2063,192.2344 305.8781,190.5938 Q304.5656,188.9375 304.5656,185.8125 Q304.5656,182.6875 305.8781,181.0313 Q307.2063,179.375 309.7063,179.375 Q310.4094,179.375 311.05,179.5313 Q311.7063,179.6875 312.2688,179.9844 L312.2688,182.7031 Q311.6438,182.125 311.05,181.8594 Q310.4563,181.5781 309.8313,181.5781 Q308.4875,181.5781 307.8,182.6563 Q307.1125,183.7188 307.1125,185.8125 Q307.1125,187.9063 307.8,188.9844 Q308.4875,190.0469 309.8313,190.0469 Q310.4563,190.0469 311.05,189.7813 Q311.6438,189.5 312.2688,188.9219 L312.2688,191.6406 Z \" fill=\"#000000\"/><text fill=\"#000000\" font-family=\"sans-serif\" font-size=\"12\" lengthAdjust=\"spacing\" textLength=\"45\" x=\"329.7\" y=\"190.1543\">Produit</text><line style=\"stroke:#A80036;stroke-width:1.5;\" x1=\"266.5\" x2=\"405.5\" y1=\"202\" y2=\"202\"/><rect fill=\"none\" height=\"6\" style=\"stroke:#C82930;stroke-width:1.0;\" width=\"6\" x=\"273.5\" y=\"210\"/><text fill=\"#000000\" font-family=\"sans-serif\" font-size=\"11\" lengthAdjust=\"spacing\" textLength=\"77\" x=\"285.5\" y=\"216.2104\">code : Integer</text><rect fill=\"none\" height=\"6\" style=\"stroke:#C82930;stroke-width:1.0;\" width=\"6\" x=\"273.5\" y=\"222.8047\"/><text fill=\"#000000\" font-family=\"sans-serif\" font-size=\"11\" lengthAdjust=\"spacing\" textLength=\"115\" x=\"285.5\" y=\"229.0151\">prixUnitaire : Integer</text><line style=\"stroke:#A80036;stroke-width:1.5;\" x1=\"266.5\" x2=\"405.5\" y1=\"235.6094\" y2=\"235.6094\"/><!--MD5=[6268cb79eb80437938a1cabad0775594]\n", + "class LigneDeCommande--><rect codeLine=\"9\" fill=\"#FEFECE\" filter=\"url(#ffz6n8r6r73x1)\" height=\"60.8047\" id=\"LigneDeCommande\" style=\"stroke:#A80036;stroke-width:1.5;\" width=\"152\" x=\"152\" y=\"305\"/><ellipse cx=\"167\" cy=\"321\" fill=\"#ADD1B2\" rx=\"11\" ry=\"11\" style=\"stroke:#A80036;stroke-width:1.0;\"/><path d=\"M169.9688,326.6406 Q169.3906,326.9375 168.75,327.0781 Q168.1094,327.2344 167.4063,327.2344 Q164.9063,327.2344 163.5781,325.5938 Q162.2656,323.9375 162.2656,320.8125 Q162.2656,317.6875 163.5781,316.0313 Q164.9063,314.375 167.4063,314.375 Q168.1094,314.375 168.75,314.5313 Q169.4063,314.6875 169.9688,314.9844 L169.9688,317.7031 Q169.3438,317.125 168.75,316.8594 Q168.1563,316.5781 167.5313,316.5781 Q166.1875,316.5781 165.5,317.6563 Q164.8125,318.7188 164.8125,320.8125 Q164.8125,322.9063 165.5,323.9844 Q166.1875,325.0469 167.5313,325.0469 Q168.1563,325.0469 168.75,324.7813 Q169.3438,324.5 169.9688,323.9219 L169.9688,326.6406 Z \" fill=\"#000000\"/><text fill=\"#000000\" font-family=\"sans-serif\" font-size=\"12\" lengthAdjust=\"spacing\" textLength=\"120\" x=\"181\" y=\"325.1543\">LigneDeCommande</text><line style=\"stroke:#A80036;stroke-width:1.5;\" x1=\"153\" x2=\"303\" y1=\"337\" y2=\"337\"/><rect fill=\"none\" height=\"6\" style=\"stroke:#C82930;stroke-width:1.0;\" width=\"6\" x=\"160\" y=\"345\"/><text fill=\"#000000\" font-family=\"sans-serif\" font-size=\"11\" lengthAdjust=\"spacing\" textLength=\"96\" x=\"172\" y=\"351.2104\">quantité : Integer</text><line style=\"stroke:#A80036;stroke-width:1.5;\" x1=\"153\" x2=\"303\" y1=\"357.8047\" y2=\"357.8047\"/><!--MD5=[ed6624c6556d5e7b1bd23032162d20b7]\n", + "class Client--><rect codeLine=\"13\" fill=\"#FEFECE\" filter=\"url(#ffz6n8r6r73x1)\" height=\"86.4141\" id=\"Client\" style=\"stroke:#A80036;stroke-width:1.5;\" width=\"114\" x=\"10\" y=\"7\"/><ellipse cx=\"46.15\" cy=\"23\" fill=\"#ADD1B2\" rx=\"11\" ry=\"11\" style=\"stroke:#A80036;stroke-width:1.0;\"/><path d=\"M49.1188,28.6406 Q48.5406,28.9375 47.9,29.0781 Q47.2594,29.2344 46.5563,29.2344 Q44.0563,29.2344 42.7281,27.5938 Q41.4156,25.9375 41.4156,22.8125 Q41.4156,19.6875 42.7281,18.0313 Q44.0563,16.375 46.5563,16.375 Q47.2594,16.375 47.9,16.5313 Q48.5563,16.6875 49.1188,16.9844 L49.1188,19.7031 Q48.4938,19.125 47.9,18.8594 Q47.3063,18.5781 46.6813,18.5781 Q45.3375,18.5781 44.65,19.6563 Q43.9625,20.7188 43.9625,22.8125 Q43.9625,24.9063 44.65,25.9844 Q45.3375,27.0469 46.6813,27.0469 Q47.3063,27.0469 47.9,26.7813 Q48.4938,26.5 49.1188,25.9219 L49.1188,28.6406 Z \" fill=\"#000000\"/><text fill=\"#000000\" font-family=\"sans-serif\" font-size=\"12\" lengthAdjust=\"spacing\" textLength=\"35\" x=\"64.85\" y=\"27.1543\">Client</text><line style=\"stroke:#A80036;stroke-width:1.5;\" x1=\"11\" x2=\"123\" y1=\"39\" y2=\"39\"/><rect fill=\"none\" height=\"6\" style=\"stroke:#C82930;stroke-width:1.0;\" width=\"6\" x=\"18\" y=\"47\"/><text fill=\"#000000\" font-family=\"sans-serif\" font-size=\"11\" lengthAdjust=\"spacing\" textLength=\"75\" x=\"30\" y=\"53.2104\">email : String</text><rect fill=\"none\" height=\"6\" style=\"stroke:#C82930;stroke-width:1.0;\" width=\"6\" x=\"18\" y=\"59.8047\"/><text fill=\"#000000\" font-family=\"sans-serif\" font-size=\"11\" lengthAdjust=\"spacing\" textLength=\"69\" x=\"30\" y=\"66.0151\">nom : String</text><rect fill=\"none\" height=\"6\" style=\"stroke:#C82930;stroke-width:1.0;\" width=\"6\" x=\"18\" y=\"72.6094\"/><text fill=\"#000000\" font-family=\"sans-serif\" font-size=\"11\" lengthAdjust=\"spacing\" textLength=\"88\" x=\"30\" y=\"78.8198\">prenom : String</text><line style=\"stroke:#A80036;stroke-width:1.5;\" x1=\"11\" x2=\"123\" y1=\"85.4141\" y2=\"85.4141\"/><ellipse cx=\"228\" cy=\"207\" fill=\"#000000\" rx=\"2\" ry=\"2\" style=\"stroke:none;stroke-width:1.0;\"/><!--MD5=[5e58994a2f0e32c893f4cb98ec0b91f4]\n", + "link Commande to apoint7--><path d=\"M127.41,207 C167.38,207 214.42,207 225.55,207 \" fill=\"none\" id=\"Commande-apoint7\" style=\"stroke:#A80036;stroke-width:1.0;\"/><text fill=\"#000000\" font-family=\"sans-serif\" font-size=\"13\" lengthAdjust=\"spacing\" textLength=\"62\" x=\"145.5\" y=\"200.0669\">comporte</text><text fill=\"#000000\" font-family=\"sans-serif\" font-size=\"13\" lengthAdjust=\"spacing\" textLength=\"7\" x=\"135.199\" y=\"203.1847\">*</text><!--MD5=[a25ac98b4e49c86dcf5b35d8b1abc2f0]\n", + "link apoint7 to Produit--><path d=\"M230.11,207 C240.09,207 250.07,207 260.05,207 \" fill=\"none\" id=\"apoint7-to-Produit\" style=\"stroke:#A80036;stroke-width:1.0;\"/><polygon fill=\"#A80036\" points=\"265.27,207,256.27,203,260.27,207,256.27,211,265.27,207\" style=\"stroke:#A80036;stroke-width:1.0;\"/><text fill=\"#000000\" font-family=\"sans-serif\" font-size=\"13\" lengthAdjust=\"spacing\" textLength=\"23\" x=\"237.9629\" y=\"201.7777\">1..*</text><!--MD5=[f38a02434c5678a2e9ce26b6952cd29d]\n", + "link apoint7 to LigneDeCommande--><path d=\"M228,209.42 C228,218.65 228,270.78 228,304.76 \" fill=\"none\" id=\"apoint7-LigneDeCommande\" style=\"stroke:#A80036;stroke-width:1.0;stroke-dasharray:7.0,7.0;\"/><!--MD5=[f72067e05319408abc0251939a098f2a]\n", + "link Client to Commande--><path codeLine=\"21\" d=\"M67,93.35 C67,117.29 67,146.89 67,169.75 \" fill=\"none\" id=\"Client-Commande\" style=\"stroke:#A80036;stroke-width:1.0;\"/><text fill=\"#000000\" font-family=\"sans-serif\" font-size=\"13\" lengthAdjust=\"spacing\" textLength=\"38\" x=\"68\" y=\"136.0669\">passe</text><text fill=\"#000000\" font-family=\"sans-serif\" font-size=\"13\" lengthAdjust=\"spacing\" textLength=\"8\" x=\"58.3625\" y=\"113.4987\">1</text><text fill=\"#000000\" font-family=\"sans-serif\" font-size=\"13\" lengthAdjust=\"spacing\" textLength=\"7\" x=\"59.3766\" y=\"158.8924\">*</text><!--MD5=[03c01ea5f2545a2a8d79bab17a9db863]\n", + "@startuml\n", + "class Commande { \n", + " - numero : Integer\n", + " - date : Date \n", + " }\n", + "class Produit {\n", + " - code : Integer\n", + " - prixUnitaire : Integer\n", + " }\n", + "class LigneDeCommande { \n", + " - quantité : Integer \n", + " } \n", + "\n", + "class Client { \n", + " - email : String \n", + " - nom : String \n", + " - prenom : String \n", + " }\n", + "\n", + "Commande \"*\" -> \"1..*\" Produit : comporte\n", + "(Commande, Produit) .. LigneDeCommande\n", + "Client \"1\" - - \"*\" Commande : passe\n", + "@enduml\n", + "\n", + "PlantUML version 1.2021.12(Tue Oct 05 16:01:58 UTC 2021)\n", + "(GPL source distribution)\n", + "Java Runtime: OpenJDK Runtime Environment\n", + "JVM: OpenJDK 64-Bit Server VM\n", + "Default Encoding: UTF-8\n", + "Language: en\n", + "Country: US\n", + "--></g></svg>" + ], + "text/plain": [ + "<IPython.core.display.SVG object>" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "%%plantuml --jar\n", + "@startuml\n", + "class Commande { \n", + " - numero : Integer\n", + " - date : Date \n", + " }\n", + "class Produit {\n", + " - code : Integer\n", + " - prixUnitaire : Integer\n", + " }\n", + "class LigneDeCommande { \n", + " - quantité : Integer \n", + " } \n", + "\n", + "class Client { \n", + " - email : String \n", + " - nom : String \n", + " - prenom : String \n", + " }\n", + "\n", + "Commande \"*\" -> \"1..*\" Produit : comporte\n", + "(Commande, Produit) .. LigneDeCommande\n", + "Client \"1\" -- \"*\" Commande : passe\n", + "@enduml" + ] + }, + { + "cell_type": "markdown", + "id": "8faa6c8f-3be8-4fa4-9675-c3f2f354adfb", + "metadata": {}, + "source": [ + "## Initialisation connection SGBD\n", + "L'intégration de SQL est faite avec [ipython-sql](https://github.com/catherinedevlin/ipython-sql).\n", + "\n", + "\n", + "Pour commencer, il faut changer l'extension SQL pour jupyter." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "ca072ea3-2f43-4542-a7ba-2d4921ca152f", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "%reload_ext sql" + ] + }, + { + "cell_type": "markdown", + "id": "5427ddce-56ea-461b-ac29-e4864b97ce8b", + "metadata": {}, + "source": [ + "Le lancement du serveur PostgreSQL et création d'une base de données est automatique avant le lancement dans le répertoire 'work/pgdata/DEMO_DB'.\n", + "\n", + "L'ouverture d'une connexion à la base de données peut se faire une seule fois ou à chaque requête (il est possible d'avoir plusieurs connections différentes)." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "cfbca6ff-1393-43da-aa4c-16869fa6f8e0", + "metadata": {}, + "outputs": [], + "source": [ + "%sql postgresql://localhost/jovyandb" + ] + }, + { + "cell_type": "markdown", + "id": "497856bb-827f-4b5c-9479-7a76b1fb4919", + "metadata": {}, + "source": [ + "## Utilisation de SQL\n", + "L'utilisation SQL peut se faire dans une cellule en le préfixant de %%sql" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "2c918a0c-5a0f-4db0-b76a-6ae37d13589a", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " * postgresql://localhost/jovyandb\n", + "Done.\n", + "Done.\n", + "Done.\n", + "Done.\n", + "Done.\n", + "Done.\n", + "Done.\n", + "Done.\n" + ] + }, + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "%%sql\n", + "DROP TABLE IF EXISTS LIGNE_DE_COMMANDE;\n", + "DROP TABLE IF EXISTS COMMANDE;\n", + "DROP TABLE IF EXISTS CLIENT;\n", + "DROP TABLE IF EXISTS PRODUIT;\n", + "\n", + "CREATE TABLE CLIENT (\n", + " id_client int GENERATED ALWAYS AS IDENTITY,\n", + " email varchar(255) NOT NULL UNIQUE,\n", + " nom varchar(100) NOT NULL,\n", + " prenom varchar(100) NOT NULL,\n", + " PRIMARY KEY(id_client) \n", + ");\n", + "\n", + "CREATE TABLE PRODUIT (\n", + " code_produit int GENERATED ALWAYS AS IDENTITY,\n", + " description varchar(10),\n", + " prix_unitaire int,\n", + " PRIMARY KEY(code_produit)\n", + ");\n", + " \n", + "CREATE TABLE COMMANDE (\n", + " numero_commande int GENERATED ALWAYS AS IDENTITY, \n", + " date date DEFAULT CURRENT_DATE,\n", + " id_client int,\n", + " PRIMARY KEY(numero_commande),\n", + " CONSTRAINT fk_client\n", + " FOREIGN KEY(id_client) \n", + " REFERENCES CLIENT(id_client)\n", + ");\n", + "\n", + "CREATE TABLE LIGNE_DE_COMMANDE (\n", + " numero_commande int,\n", + " code_produit int,\n", + " quantite int,\n", + " PRIMARY KEY(numero_commande, code_produit)\n", + ");" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "e3b35f69-a5eb-4888-b518-84f3a0841fba", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " * postgresql://localhost/jovyandb\n", + "1 rows affected.\n", + "1 rows affected.\n", + "1 rows affected.\n" + ] + }, + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "%%sql\n", + "INSERT INTO CLIENT (email, nom, prenom) VALUES ('a.b@x.fr','a','b');\n", + "INSERT INTO CLIENT (email, nom, prenom) VALUES ('c.d@x.fr','c','d');\n", + "INSERT INTO CLIENT (email, nom, prenom) VALUES ('e.f@x.fr','e','f');" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "9232e8ad-c21e-4bf1-b92d-30be7ec5d94a", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " * postgresql://localhost/jovyandb\n", + "3 rows affected.\n" + ] + }, + { + "data": { + "text/html": [ + "<table>\n", + " <tr>\n", + " <th>id_client</th>\n", + " <th>email</th>\n", + " <th>nom</th>\n", + " <th>prenom</th>\n", + " </tr>\n", + " <tr>\n", + " <td>1</td>\n", + " <td>a.b@x.fr</td>\n", + " <td>a</td>\n", + " <td>b</td>\n", + " </tr>\n", + " <tr>\n", + " <td>2</td>\n", + " <td>c.d@x.fr</td>\n", + " <td>c</td>\n", + " <td>d</td>\n", + " </tr>\n", + " <tr>\n", + " <td>3</td>\n", + " <td>e.f@x.fr</td>\n", + " <td>e</td>\n", + " <td>f</td>\n", + " </tr>\n", + "</table>" + ], + "text/plain": [ + "[(1, 'a.b@x.fr', 'a', 'b'),\n", + " (2, 'c.d@x.fr', 'c', 'd'),\n", + " (3, 'e.f@x.fr', 'e', 'f')]" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "%%sql \n", + "SELECT * FROM CLIENT" + ] + }, + { + "cell_type": "markdown", + "id": "e9130678-99f7-42c0-a474-aabfbfc8f355", + "metadata": {}, + "source": [ + "Les résultats des requêtes peuvent être affecté dans des variables python et traitée sous forme de dataframes avec la librairie Panda." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "c0e8873f-6c46-455d-829d-d042770d9e08", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " * postgresql://localhost/jovyandb\n", + "3 rows affected.\n", + "<class 'pandas.core.frame.DataFrame'>\n", + "RangeIndex: 3 entries, 0 to 2\n", + "Data columns (total 4 columns):\n", + " # Column Non-Null Count Dtype \n", + "--- ------ -------------- ----- \n", + " 0 id_client 3 non-null int64 \n", + " 1 email 3 non-null object\n", + " 2 nom 3 non-null object\n", + " 3 prenom 3 non-null object\n", + "dtypes: int64(1), object(3)\n", + "memory usage: 224.0+ bytes\n" + ] + } + ], + "source": [ + "clients = %sql SELECT * FROM CLIENT\n", + "clients.DataFrame().info()" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "cc525ac0-15e4-4ef8-a16b-cad00ce948e3", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " * postgresql://localhost/jovyandb\n", + "1 rows affected.\n", + "1 rows affected.\n", + "1 rows affected.\n" + ] + }, + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "%%sql\n", + "INSERT INTO PRODUIT (description, prix_unitaire) VALUES ('pomme',2);\n", + "INSERT INTO PRODUIT (description, prix_unitaire) VALUES ('peche',4);\n", + "INSERT INTO PRODUIT (description, prix_unitaire) VALUES ('poire',3);" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "2ba87c2d-65bf-45f9-a71c-1130c11c7e2b", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " * postgresql://localhost/jovyandb\n", + "3 rows affected.\n" + ] + }, + { + "data": { + "text/html": [ + "<table>\n", + " <tr>\n", + " <th>code_produit</th>\n", + " <th>description</th>\n", + " <th>prix_unitaire</th>\n", + " </tr>\n", + " <tr>\n", + " <td>1</td>\n", + " <td>pomme</td>\n", + " <td>2</td>\n", + " </tr>\n", + " <tr>\n", + " <td>2</td>\n", + " <td>peche</td>\n", + " <td>4</td>\n", + " </tr>\n", + " <tr>\n", + " <td>3</td>\n", + " <td>poire</td>\n", + " <td>3</td>\n", + " </tr>\n", + "</table>" + ], + "text/plain": [ + "[(1, 'pomme', 2), (2, 'peche', 4), (3, 'poire', 3)]" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "%%sql \n", + "SELECT * FROM PRODUIT" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "e68b5145-ea69-4574-ac1c-6f1c67de5567", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " * postgresql://localhost/jovyandb\n", + "1 rows affected.\n" + ] + } + ], + "source": [ + "insert_command_result=%sql INSERT INTO COMMANDE (id_client) VALUES (1) RETURNING numero_commande;\n", + "numero_commande=insert_command_result[0][0]" + ] + }, + { + "cell_type": "markdown", + "id": "2b458632-71cf-4872-ba51-b226bedfe637", + "metadata": {}, + "source": [ + "Il est aussi possible d'utiliser des variables python comme paramètres des requêtes." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "ea570c9b-8b52-4099-b5ac-fd14e880def0", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " * postgresql://localhost/jovyandb\n", + "1 rows affected.\n", + "1 rows affected.\n", + "1 rows affected.\n", + "3 rows affected.\n" + ] + }, + { + "data": { + "text/html": [ + "<table>\n", + " <tr>\n", + " <th>numero_commande</th>\n", + " <th>code_produit</th>\n", + " <th>quantite</th>\n", + " </tr>\n", + " <tr>\n", + " <td>1</td>\n", + " <td>1</td>\n", + " <td>5</td>\n", + " </tr>\n", + " <tr>\n", + " <td>1</td>\n", + " <td>2</td>\n", + " <td>2</td>\n", + " </tr>\n", + " <tr>\n", + " <td>1</td>\n", + " <td>3</td>\n", + " <td>1</td>\n", + " </tr>\n", + "</table>" + ], + "text/plain": [ + "[(1, 1, 5), (1, 2, 2), (1, 3, 1)]" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "%%sql\n", + "INSERT INTO LIGNE_DE_COMMANDE VALUES ({numero_commande}, 1,5);\n", + "INSERT INTO LIGNE_DE_COMMANDE VALUES ({numero_commande}, 2,2);\n", + "INSERT INTO LIGNE_DE_COMMANDE VALUES ({numero_commande}, 3,1);\n", + "\n", + "SELECT * FROM LIGNE_DE_COMMANDE;" + ] + }, + { + "cell_type": "markdown", + "id": "a5f348ed-9b42-430d-afde-ae138eb03712", + "metadata": {}, + "source": [ + "Et donc de les afficher très simple y compris sous forme graphique." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "96f25786-c320-49ff-8345-88edd2f827ec", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " * postgresql://localhost/jovyandb\n", + "3 rows affected.\n" + ] + }, + { + "data": { + "text/plain": [ + "<AxesSubplot:xlabel='description'>" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "<Figure size 432x288 with 1 Axes>" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "result = %sql select * from PRODUIT; \n", + "produits_dataframe = result.DataFrame()\n", + "produits_dataframe.set_index('description')[[\"prix_unitaire\"]].plot.bar(rot=0)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python [conda env:root] *", + "language": "python", + "name": "conda-root-py" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.8" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/run-with-docker.sh b/run-with-docker.sh new file mode 100755 index 0000000000000000000000000000000000000000..349ad1e8ced4b7ec0fbcc0733f3ea799a9159548 --- /dev/null +++ b/run-with-docker.sh @@ -0,0 +1,7 @@ +docker run --rm \ + --name JupyterJava-${PWD##*/} \ + --volume $PWD:/home/jovyan/${PWD##*/} \ + --publish 8888:8888 \ + --env NB_UID=$UID \ + --env JUPYTER_ENABLE_LAB=yes \ + brunoe/jupyterdb:develop