{"id":897,"date":"2019-12-15T14:28:00","date_gmt":"2019-12-15T13:28:00","guid":{"rendered":"http:\/\/wollef.org\/?p=897"},"modified":"2019-12-15T14:28:00","modified_gmt":"2019-12-15T13:28:00","slug":"d-manipuler-une-base-de-donnees-en-python","status":"publish","type":"post","link":"https:\/\/wollef.org\/blog\/d-manipuler-une-base-de-donnees-en-python\/","title":{"rendered":"Raspberry Cars &#8211; Les Technos (3\/4) &#8211; Manipuler une base de donn\u00e9es en Python"},"content":{"rendered":"\n<h1 class=\"wp-block-heading\"><a>Une base de donn\u00e9es locale sur le Raspberry<\/a><\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Pendant les\nvoyages, le Raspberry Pi n\u2019est pas toujours connect\u00e9 \u00e0 l\u2019internet. C\u2019est pour\n\u00e7a qu\u2019on va utiliser une base de donn\u00e9es locale.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Dans cette base de\ndonn\u00e9es, on va enregistrer les positions GPS, les diff\u00e9rentes informations de\nla voiture et ceci \u00e0 p\u00e9riode r\u00e9guli\u00e8re.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La base de donn\u00e9es\nva \u00eatre simple et facile \u00e0 modifier dans python.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Quand on cherche\nsur internet il y en a une qui s\u2019appelle SQL Lite. Elle correspond \u00e0 mon\nbesoin, je vais donc apprendre \u00e0 l\u2019utiliser&nbsp;:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Travailler avec <strong>SQLLite<\/strong><ul><li>Savoir l\u2019installer sur le Raspberry<\/li><\/ul><ul><li>Manipuler directement la base de donn\u00e9es<\/li><\/ul><\/li><\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Pour cette premi\u00e8re partie,\nj\u2019ai trouv\u00e9 un tutorial int\u00e9ressant, qui ressemble \u00e0 mon projet&nbsp;: <\/em><a href=\"https:\/\/iotbytes.wordpress.com\/sqlite-db-on-raspberry-pi\/\"><em>https:\/\/iotbytes.wordpress.com\/sqlite-db-on-raspberry-pi\/<\/em><\/a><\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Manipuler la base de donn\u00e9es en Python<ul><li>Installer le driver SQLLite pour Pyhton<\/li><\/ul><ul><li>Programmer en Python les acc\u00e8s<\/li><\/ul><\/li><\/ul>\n\n\n\n<h1 class=\"wp-block-heading\"><a>Installer SQLLite sur le Raspberry<\/a><\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Pour installer sqllite sur le raspberry PI, il faut utiliser le programme d\u2019installation de package, en demandant sqllite&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo apt-get install sqlite3<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Nota&nbsp;: On\nutilise <\/em><em>sudo<\/em><em> pour agir comme \u2018super utilisateur\u2019 du\nRaspberry.<\/em><\/p>\n\n\n\n<h1 class=\"wp-block-heading\"><a>Cr\u00e9er \u00e0 la main la base de donn\u00e9es SQLLite<\/a> <\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Une base de donn\u00e9es\n<strong>sqlite<\/strong> est un fichier sur le disque du Raspberry.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Pour le cr\u00e9er et y acc\u00e9der, on va se placer l\u00e0 o\u00f9 on veut que soit stock\u00e9 le fichier. Et lancer la commande de cr\u00e9ation de DB.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sqlite3 raspberrycars.db<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">On se retrouve avec l\u2019interface de la DB en ligne de commande.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"http:\/\/wollef.org\/wp-content\/uploads\/2020\/01\/sql1.png\" alt=\"\" class=\"wp-image-898\"\/><\/figure>\n\n\n\n<h1 class=\"wp-block-heading\"><a>Manipuler directement la base de donn\u00e9es SQLLite<\/a> <\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Une base de donn\u00e9es\nest compos\u00e9e de \u2018tables\u2019, qui sont des tableaux regroupant les informations sur\nun m\u00eame sujet (par exemple une voiture, un enregistrement de position, etc.).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Par exemple, si on\nveut stocker la liste des positions, la table va ressembler&nbsp;\u00e0&nbsp;:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"\"><tbody><tr><td>\n  datetime\n  <\/td><td>\n  longitude\n  <\/td><td>\n  latitude\n  <\/td><td>\n  vitesse\n  <\/td><\/tr><tr><td>\n  15\/12\/2019\n  10:00:00\n  <\/td><td>\n  6.1092364\n  <\/td><td>\n  49.7568344\n  <\/td><td>\n  55\n  <\/td><\/tr><tr><td>\n  15\/12\/2019 10:10:00\n  <\/td><td>\n  6.0872419\n  <\/td><td>\n  49.7570599\n  <\/td><td>\n  50\n  <\/td><\/tr><tr><td>\n  15\/12\/2019 10:20:00\n  <\/td><td>\n  6.0855955\n  <\/td><td>\n  49.7602693\n  <\/td><td>\n  20\n  <\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Pour demander \u00e0 cr\u00e9er cette table car_status , on va utiliser la commande sqlite3 suivante<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>CREATE TABLE car_status ( gps_datetime integer\n, gps_longitude  Decimal(9,6)\n, gps_latitude  Decimal(9,6)\n, gps_speed  Decimal(9,2)\n) ;<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Nota&nbsp;: on\nutilise un integer pour stocker l\u2019heure&nbsp;: ce sera le nombre de secondes\ndepuis le 1<sup>er<\/sup> janvier 1970&nbsp;: c\u2019est une convention sur les\nsyst\u00e8me Unix.<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">On peut regarder ce\nqu\u2019il y a dans cette nouvelle table&nbsp;en faisant la commande select<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>(le print screen avec tout ces enchainements de commande est \u00e0 la fin de cette rubrique)<\/em><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>select * from car_status ;<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">La commande ne\nrenvoie rien, car il n\u2019y a encore rien dans la table&nbsp;!<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">On doit ins\u00e9rer un premier enregistrement. <em>Pour le moment on va mettre des valeurs absurdes. Plus tard, on va mettre les vraies valeurs renvoy\u00e9es par le capteur.<\/em> La commande qui sert \u00e0 ajouter des lignes dans une table est INSERT<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Insert into car_status  ( gps_datetime , gps_longitude  , gps_latitude  ,  gps_speed  ) values ( 1, 6.109236, 49.756834, \t55.00 )<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;Si on relance la commande select, on voit\nmaintenant le nouvel enregistrement.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Rajoutons maintenant les trois autres lignes&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Insert into car_status  ( gps_datetime , gps_longitude  , gps_latitude  ,  gps_speed  ) values ( 2, 6.087241,\t49.757059,\t50.00)\nInsert into car_status  ( gps_datetime , gps_longitude  , gps_latitude  ,  gps_speed  ) values ( 3, 6.085595,\t49.760269,\t20.00)<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Si on relance la\ncommande select, on voit maintenant les trois enregistrements.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Voici le print screen correspondant \u00e0 la liste des commandes sqlite que nous avons lanc\u00e9es.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"http:\/\/wollef.org\/wp-content\/uploads\/2020\/01\/sql2.png\" alt=\"\" class=\"wp-image-899\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Avec une base de donn\u00e9es, ce qui est important est de faire des requ\u00eates. On peut ainsi demander \u00e0 avoir un enregsitrement pr\u00e9cis&nbsp;: par exemple celui fait pour l\u2019heure \u20182\u2019.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>select * from car_status where gps_datetime = 2;<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Ou tout ceux apr\u00e8s l\u2019heure \u20182\u2019 incluse. <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>select * from car_status where gps_datetime >= 2;<\/code><\/pre>\n\n\n\n<h1 class=\"wp-block-heading\"><a>Lire en Python le contenu de la base de donn\u00e9es<\/a><\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Acc\u00e9der \u00e0 une base\nsqlite en python est facile.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>J\u2019ai trouv\u00e9 des informations dans ce tutorial&nbsp;:<\/em><\/p>\n\n\n\n<figure class=\"wp-block-embed-wordpress wp-block-embed is-type-wp-embed is-provider-sqlite-tutorial\"><div class=\"wp-block-embed__wrapper\">\n<blockquote class=\"wp-embedded-content\" data-secret=\"c4LngTdwYA\"><a href=\"https:\/\/www.sqlitetutorial.net\/sqlite-python\/\">SQLite Python<\/a><\/blockquote><iframe loading=\"lazy\" class=\"wp-embedded-content\" sandbox=\"allow-scripts\" security=\"restricted\" style=\"position: absolute; visibility: hidden;\" title=\"&#8220;SQLite Python&#8221; &#8212; SQLite Tutorial\" src=\"https:\/\/www.sqlitetutorial.net\/sqlite-python\/embed\/#?secret=QGhN9t2N9R#?secret=c4LngTdwYA\" data-secret=\"c4LngTdwYA\" width=\"600\" height=\"338\" frameborder=\"0\" marginwidth=\"0\" marginheight=\"0\" scrolling=\"no\"><\/iframe>\n<\/div><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Au d\u00e9but de son programme Python, on doit demander d\u2019utiliser la librairie python pour sqlite.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import sqlite3<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Ensuite, on se\nconnecte \u00e0 la DB (j\u2019ai recopi\u00e9 un code d\u2019exemple\u2026)<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>conn = sqlite3.connect(db_file)<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">On demande un\ncurseur pour pouvoir faire une requ\u00eate<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>cur = conn.cursor()<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">On demande d\u2019ex\u00e9cuter\nla requ\u00eate&nbsp;<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>cur.execute(\"SELECT * FROM car_status\")<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">On demande\nd\u2019obtenir les r\u00e9sultats<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>rows = cur.fetchall()<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Et pour v\u00e9rifier si cela a fonctionn\u00e9, on lance une boucle sur les lignes renvoy\u00e9e<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>for row in rows:\n   print(row)<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Voici ce que cela donne dans l\u2019IDE python<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"http:\/\/wollef.org\/wp-content\/uploads\/2020\/01\/sql3.png\" alt=\"\" class=\"wp-image-900\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Et le code complet <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import sqlite3\n\nconn = sqlite3.connect('\/home\/pi\/RaspberryCars\/raspberrycars.db');\n\ncur = conn.cursor();\n\ncur.execute(\"select * from car_status\");\n\nrows = cur.fetchall();\n\nfor row in rows :\n    print (row)\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\"><a>6.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nEcrire en Python du contenu dans la base de\ndonn\u00e9es<\/a><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Alors comment\nfait-on pour ins\u00e9rer une nouvelle ligne&nbsp;dans la table ? <\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>(car on devra\nins\u00e9rer les lignes r\u00e9cup\u00e9r\u00e9es depuis le capteur).<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">On utilise la commande insert avec la fonction <em>execute<\/em> du curseur&nbsp;!<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>cur.execute(\n    \"insert into car_status (gps_datetime, gps_longitude, gps_latitude, gps_speed) values ( ?, ?, ? , ? ) \",\n    (4, 6.101010, 49.757575, 30)\n)<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Le premier param\u00e8tre est la m\u00eame instruction que l\u2019on tapait \u00e0 la main dans sqlite, mais pour laquelle les nouvelles valeurs sont remplac\u00e9es par des&nbsp;points d\u2019interrogation&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>( ?, ?, ? , ? )<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Le deuxi\u00e8me param\u00e8tre est le contenu que l\u2019on veut ins\u00e9rer,\ndans le m\u00eame ordre, sous forme d\u2019un objet en python<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>(4, 6.101010, 49.757575, 30)<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Pour provoquer\nl\u2019enregsitrement des nouvelles valeurs, on doit demander \u00e0 la connection de\n\u2018commiter\u2019 les changements faits dans la base par le curseur.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">C\u2019est l\u2019instruction\ncommit&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>conn.commit();<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">A la fin du programme, on demande de fermer la connection \u00e0\nla DB .<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>conn.close();<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Voil\u00e0 ce que cela donne dans l\u2019IDE python&nbsp;:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"http:\/\/wollef.org\/wp-content\/uploads\/2020\/01\/sql4.png\" alt=\"\" class=\"wp-image-901\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Et le code complet,\navec la partie concernant l\u2019insertion en rouge. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Ici on a fait afficher aussi la liste des lignes avant l\u2019insertion, et apr\u00e8s l\u2019insertion, pour v\u00e9rifier que tout se passe comme imagin\u00e9.<\/em><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import sqlite3\n\nconn = sqlite3.connect('\/home\/pi\/RaspberryCars\/raspberrycars.db');\ncur = conn.cursor();\n\nprint (\"Contenu de la table avant l'insertion\")\ncur.execute(\"select * from car_status\");\nrows = cur.fetchall();\nfor row in rows :\n    print (row)\n\ncur.execute(\n    \"insert into car_status (gps_datetime, gps_longitude, gps_latitude, gps_speed) values ( ?, ?, ? , ? ) \",\n    (4, 6.101010, 49.757575, 30)\n)\n\nconn.commit();\n\nprint (\"Contenu de la table apr\u00e8s l'insertion\")\ncur.execute(\"select * from car_status\");\nrows = cur.fetchall();\nfor row in rows :\n    print (row);\n\nconn.close();\n<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Une base de donn\u00e9es locale sur le Raspberry Pendant les voyages, le Raspberry Pi n\u2019est pas toujours connect\u00e9 \u00e0 l\u2019internet. C\u2019est pour \u00e7a qu\u2019on va utiliser une base de donn\u00e9es locale. Dans cette base de donn\u00e9es, on va enregistrer les positions GPS, les diff\u00e9rentes informations de la voiture et ceci \u00e0 p\u00e9riode r\u00e9guli\u00e8re. La base <a class=\"read-more\" href=\"https:\/\/wollef.org\/blog\/d-manipuler-une-base-de-donnees-en-python\/\">Continue Reading<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[31,16,17,21],"tags":[],"class_list":["post-897","post","type-post","status-publish","format-standard","hentry","category-raspberry-cars","category-python","category-raspberry-pi","category-sqllite"],"_links":{"self":[{"href":"https:\/\/wollef.org\/blog\/wp-json\/wp\/v2\/posts\/897","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wollef.org\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wollef.org\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wollef.org\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wollef.org\/blog\/wp-json\/wp\/v2\/comments?post=897"}],"version-history":[{"count":0,"href":"https:\/\/wollef.org\/blog\/wp-json\/wp\/v2\/posts\/897\/revisions"}],"wp:attachment":[{"href":"https:\/\/wollef.org\/blog\/wp-json\/wp\/v2\/media?parent=897"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wollef.org\/blog\/wp-json\/wp\/v2\/categories?post=897"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wollef.org\/blog\/wp-json\/wp\/v2\/tags?post=897"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}