logo Debian Debian Debian-France Debian-Facile Debian-fr.org Forum-Debian.fr Debian ? Communautés logo inclusivité

Debian-facile

Bienvenue sur Debian-Facile, site d'aide pour les nouveaux utilisateurs de Debian.

Vous n'êtes pas identifié(e).

#1 15-07-2015 06:25:17

Orsam999
Membre
Distrib. : Debian 10 (Buster)
Noyau : Linux 4.19.0-5-amd64
Inscription : 16-01-2015

Bash communication MySQL

Bonjour à tous,


J'ai trouvé un code sur internet pour extraire des données de ma base MySql. (Je n'ai pas tenté de INSERT, mais je verrais ça plus tard)


Voici le code :


hote_db="localhost"
nom_bd="citations"
login_db="user"
pass_bd="monpass"

select_noms_colonnes="citation,auteur"
nom_table="citations"

ma_requete(){
        typeset col=$1
        mysql -h"$hote_db" -D"$nom_bd" -u"$login_db" -p"$pass_bd" -B -N -e "SELECT $col FROM $nom_table ORDER BY Rand() limit 1"
}


resultat=$(ma_requete $select_noms_colonnes)
echo $resultat


 



Bon, très bien, ça marche.... big_smile


Le problème est que ma variable résultat contient le résultat des deux champs (citation et auteur). Ce que je cherche à faire, c'est d'avoir deux variables distincte, une qui me donne le résultat du champ "Citation" et l'autre qui me donne le champ "Auteur".


J'ai lu qu'il fallait couper le résultat avec la fonction cut, mais ou est le délimiteur ?? pour exemple, le code ci-dessus me donne le résultat suivant ;

Des plus profond désir, naissent souvent les haines les plus mortelles. Socrate



Et bien sure, je ne peux pas couper au point (.) car il peut y en avoir plusieurs dans une citation et cela me parait un peu hasardeux. hmm


Merci d'avance pour votre aide.


Orsam

Dernière modification par Orsam999 (15-07-2015 06:25:46)


Celui qui ne progresse pas chaque jour, recule chaque jour.
Confucius

Hors ligne

#2 15-07-2015 06:49:37

Orsam999
Membre
Distrib. : Debian 10 (Buster)
Noyau : Linux 4.19.0-5-amd64
Inscription : 16-01-2015

Re : Bash communication MySQL

Re-moi,

Je viens de faire un test : Premièrement, j'ai ajouter un pipe dans la request SQL ;

select_noms_colonnes="citation,'|',auteur"
 



Donc la requete ressemble à ça :

 "SELECT citation,'|',auteur FROM $nom_table ORDER BY Rand() limit 1"



Donc, si je reprends la citation d'exemple avec cette requete, ça donne ça :

Des plus profond désir, naissent souvent les haines les plus mortelles.|Socrate



Avec le pipe devant "Socrate". Ensuite,


resultat=$(ma_requete $select_noms_colonnes)
citation=$(echo $resultat | cut -d \| -f 1)
auteur=$(echo $resultat | cut -d \| -f 2)




Ca marche, mais ma question est, n'est-ce pas du bricolage, n'y a t'il pas une façon plus "propre" ???


Merci à tous


Celui qui ne progresse pas chaque jour, recule chaque jour.
Confucius

Hors ligne

#3 15-07-2015 08:52:46

captnfab
Admin-Girafe
Lieu : /dev/random
Distrib. : Debian
Noyau : Dur
(G)UI : gui gui, je zuis un doiseau
Inscription : 07-07-2008
Site Web

Re : Bash communication MySQL

En Bash, pas vraiment non. À ta place, j'utiliserais python pour faire ça, c'est plus sûr et plus élégant.

Tu pourrais récupérer le champ id uniquement. Puis ensuite faire une requête par colonne en fonction de ce champ id.
Mais ça nécessite que la table contienne une colonne id (ce qui est une bonne pratique, mais pas toujours suivie.)

captnfab,
Association Debian-Facile, bépo.
TheDoctor: Your wish is my command… But be careful what you wish for.

Hors ligne

#4 16-07-2015 06:21:51

Orsam999
Membre
Distrib. : Debian 10 (Buster)
Noyau : Linux 4.19.0-5-amd64
Inscription : 16-01-2015

Re : Bash communication MySQL

Bonjour captnfab, et merci pour ta réponse.

Premièrement toutes mes tables ont un ID (c'est la moindre des choses... big_smile), Et deuxièmement, le problème c'est que je viens de commencer Linux, et je n'ai aucune connaissance en Python. Je ne serais même pas par quoi commencer..


Est-ce qu'ont peu faire du python comme ont fait des scripts SH ?? Est-ce que mon serveur Debian comprend nativement ce langage ? tu vois j'ai beaucoup de questions...

Mais une fois que je connaitrais l'environnement de développement, je peux me mettre à Python... Pourquoi pas... big_smile


Merci encore pour ta réponse.



Orsam

Celui qui ne progresse pas chaque jour, recule chaque jour.
Confucius

Hors ligne

#5 16-07-2015 06:50:16

Orsam999
Membre
Distrib. : Debian 10 (Buster)
Noyau : Linux 4.19.0-5-amd64
Inscription : 16-01-2015

Re : Bash communication MySQL

Re-Bonjour captnfab,

J'ai la réponse à mes deux questions précédentes. Je viens de faire mon premier script "Hello World" Python sous Debian. cool

Encore un langage à apprendre... big_smile

Encore une question, est-ce que les fichiers sh et py peuvent communiquer ?? Cela veut il dire que je peux utiliser les deux langages selon mes besoins ?


Merci encore.

Orsam

Celui qui ne progresse pas chaque jour, recule chaque jour.
Confucius

Hors ligne

#6 16-07-2015 07:23:11

paskal
autobahn
Lieu : ailleurs
Inscription : 14-06-2011
Site Web

Re : Bash communication MySQL

Bonjour,


J'utilise pexpect (http://pexpect.sourceforge.net/pexpect.html), par exemple :

p=pexpect.spawn('ssh -p '+port+' '+user+'@'+serveur)


I'd love to change the world
But I don't know what to do
So I'll leave it up to you...

logo-sur-fond.png

Hors ligne

#7 16-07-2015 07:44:01

Orsam999
Membre
Distrib. : Debian 10 (Buster)
Noyau : Linux 4.19.0-5-amd64
Inscription : 16-01-2015

Re : Bash communication MySQL

Bonjour paskal,

Et merci pour ta réponse, mais je ne vois pas trop l’intérêt de pexpert, peux tu m'expliquer un peu ? Car la doc est un peu obscure pour moi. Comme je le disais dans mes premier post, je debute en linux et Python m'est complétement inconnu (a part le nom bien sure).

Alors il faut être un peu plus précis (et patient) avec moi wink

Merci encore..

Orsam

Celui qui ne progresse pas chaque jour, recule chaque jour.
Confucius

Hors ligne

#8 16-07-2015 08:29:21

paskal
autobahn
Lieu : ailleurs
Inscription : 14-06-2011
Site Web

Re : Bash communication MySQL

Pexpect (et non pas pexpert) est un module python permettant de lancer des applications en tant que processus fils, et d'interagir avec elles.
Je pense donc que tu peux lancer ta requête mysql à travers pexpect, en récupérer le résultat et le traiter en python, comme te l'a suggéré captnfab.

Cela dit, tu n'es pas obligé d'utiliser ce module.
Je te conseille de faire un tour sur le site developpez.com, en particulier http://python.developpez.com/cours/Pyth … on-outils/  smile

I'd love to change the world
But I don't know what to do
So I'll leave it up to you...

logo-sur-fond.png

Hors ligne

#9 16-07-2015 09:25:22

captnfab
Admin-Girafe
Lieu : /dev/random
Distrib. : Debian
Noyau : Dur
(G)UI : gui gui, je zuis un doiseau
Inscription : 07-07-2008
Site Web

Re : Bash communication MySQL

Salut smile

Il y a mieux que pexepect pour communiquer entre python et mysql, il y a des libs toutes faites smile

aptitude search ~npython~nmysql



Ces interfaces permettent de rajouter des fonctions à importer dans le code python (mot clé « import ») et qui peuvent elle-mêmes faire les requêtes à MySQL, tout en te renvoyant directement des tableaux.

Exemple (en utilisant python3-mysql.connector vu que je fais du python3) :

#!/usr/bin/env python3

import mysql.connector

config_bdd = {
  'user':       'nom utilisateur',
  'password':   'mot de passe',
  'host':       '127.0.0.1',
  'database':   'base de données',
  'charset':    'utf8'
}


bdd = mysql.connector.connect(**config_bdd)

# Récupération de la liste des adhérents
bdd_users = []
bdd_cursor = bdd.cursor()
bdd_users_query = ( "SELECT pseudo_adh, email_adh, id_statut FROM adherents ORDER BY pseudo_adh ASC" )
bdd_cursor.execute(bdd_users_query)
bdd_users = bdd_cursor.fetchall()
bdd_cursor.close()
for i in range(len(bdd_users)):
    bdd_users[i]=list(bdd_users[i])
 



Et avec ça, pas de truc sale du genre cut & co smile


captnfab,
Association Debian-Facile, bépo.
TheDoctor: Your wish is my command… But be careful what you wish for.

Hors ligne

#10 16-07-2015 09:53:54

paskal
autobahn
Lieu : ailleurs
Inscription : 14-06-2011
Site Web

Re : Bash communication MySQL

Orsam999 a écrit :

est-ce que les fichiers sh et py peuvent communiquer ?? Cela veut il dire que je peux utiliser les deux langages selon mes besoins ?

Tu peux aussi employer des méthodes du genre :

import os
bashCommand = "source script.sh"
os.system(bashCommand)


I'd love to change the world
But I don't know what to do
So I'll leave it up to you...

logo-sur-fond.png

Hors ligne

#11 16-07-2015 10:25:46

captnfab
Admin-Girafe
Lieu : /dev/random
Distrib. : Debian
Noyau : Dur
(G)UI : gui gui, je zuis un doiseau
Inscription : 07-07-2008
Site Web

Re : Bash communication MySQL

paskal a écrit :

import os
bashCommand = "source script.sh"
os.system(bashCommand)



Alors, là aussi, ce n'est pas forcément ma méthode préférée.
Le code ci-dessus lance un shell, c'est la commande os.system qui fait ça
et ce shell source ensuite le script, en ignorant le #! du script. Tes scripts .sh peuvent être des scripts zsh, dash, bash, etc. et le shell lancé par os.system peut en être un autre.

Je proposes plutôt cela :

#!/usr/bin/env python3
import os
commande = "./script.sh"
os.system(commande)



Ou encore

#!/usr/bin/env python3
import os
commande="./script.sh"
if(os.fork()==0):
  os.execl(commande)
  #ou s'il y a des arguments :
  #os.execl(commande,argument1,argument2)
  exit(1)



Ces deux méthodes nécessitent que le script soit exécutable (ce qui est plutôt une bonne pratique si tu veux exécuter le script…), mais fonctionnent également avec n'importe quel exécutable.
Pense également à bien commencer tes scripts shell par la ligne

#!/bin/sh


si tu écris en shell posix, ou

#!/bin/bash


si tu es un habitué des bashismes smile

De la même manière, commence tes scripts python par

#!/usr/bin/env python


si tu fais du python 2, ou par

#!/usr/bin/env python3


si tu fais du python 3.

C'est important car c'est cette ligne qui détermine comment sera lancé le script quand tu fais ./monscript.


captnfab,
Association Debian-Facile, bépo.
TheDoctor: Your wish is my command… But be careful what you wish for.

Hors ligne

#12 16-07-2015 10:31:01

paskal
autobahn
Lieu : ailleurs
Inscription : 14-06-2011
Site Web

Re : Bash communication MySQL

captnfab a écrit :

Le code ci-dessus lance un shell, c'est la commande os.system qui fait ça
et ce shell source ensuite le script, en ignorant le #! du script. Tes scripts .sh peuvent être des scripts zsh, dash, bash, etc. et le shell lancé par os.system peut en être un autre.

Ouch ! Pas tout compris, là.  big_smile
Tu peux expliciter les inconvénients ?  smile


I'd love to change the world
But I don't know what to do
So I'll leave it up to you...

logo-sur-fond.png

Hors ligne

#13 16-07-2015 10:41:19

captnfab
Admin-Girafe
Lieu : /dev/random
Distrib. : Debian
Noyau : Dur
(G)UI : gui gui, je zuis un doiseau
Inscription : 07-07-2008
Site Web

Re : Bash communication MySQL

Considérons le script suivant :

#!/bin/zsh
friends=( "paskal" "smolski" "captnfab")
echo "${friends[1]}"



Si ce code est exécuté par dash, le shell par défaut du système, il va renvoyer :

dash: 1: Syntax error: "(" unexpected



Si ce code est exécuté par bash, le shell par défaut des utilisateurs, il va renvoyer :

smolski



Si ce code est exécuté par zsh, comme demandé par le #!, il va renvoyer :

paskal




(Tout ça parce que la syntaxe des tableaux est tout sauf faisant partie du standard POSIX.)


Si tu exécutes le code via ./nomduscript, le #! sera lu, et zsh sera exécuté.


Si tu exécutes le code via « source ./nomduscript », le #! sera ignoré, et dash ou bash (je ne sais pas si os.system utilise le shell utilisateur ou le shell système) liront le code, et renverront le mauvais résultat…


Et c'est sans compter que « source » lui-même n'est pas un mot-clé POSIX, et n'est pas reconnu par dash…


captnfab,
Association Debian-Facile, bépo.
TheDoctor: Your wish is my command… But be careful what you wish for.

Hors ligne

#14 16-07-2015 12:07:38

paskal
autobahn
Lieu : ailleurs
Inscription : 14-06-2011
Site Web

Re : Bash communication MySQL

Merci pour cette explication limpide.  smile

I'd love to change the world
But I don't know what to do
So I'll leave it up to you...

logo-sur-fond.png

Hors ligne

#15 18-07-2015 07:27:09

Orsam999
Membre
Distrib. : Debian 10 (Buster)
Noyau : Linux 4.19.0-5-amd64
Inscription : 16-01-2015

Re : Bash communication MySQL

Bonjour à vous deux... et encore merci


Oulala.... Pour moi, débutant, ça faut beaucoup d'info d'un coup big_smile


Il faut que je passe un long moment à tester tout ça..


Je commence d'abord par le debut, quand je tape :

python --version



Le résultat est Python 2.7.3

python3 --version



Il ne connait pas...


Comme je débute en Python, ne dois-je pas commencer directement en Python 3 ??


En ce qui concerne ce que tu disais captnfab :

Ces deux méthodes nécessitent que le script soit exécutable (ce qui est plutôt une bonne pratique si tu veux exécuter le script…), mais fonctionnent également avec n'importe quel exécutable.
Pense également à bien commencer tes scripts shell par la ligne



Tous mes fichiers Bash commence par

#!/bin/bash
 



Mon premier "Hello World" en Python est :

#!/usr/bin/python
 




Mais je ne sais pas à quoi corresponde les "#!/usr/bin/env python" ou zsh... roll


Désolé de revenir sur des choses simples pour vous, mais il faut que je commence par le début...



Orsam

Dernière modification par Orsam999 (18-07-2015 07:40:52)


Celui qui ne progresse pas chaque jour, recule chaque jour.
Confucius

Hors ligne

#16 18-07-2015 07:45:56

paskal
autobahn
Lieu : ailleurs
Inscription : 14-06-2011
Site Web

Re : Bash communication MySQL

Bonjour

Orsam999 a écrit :

Comme je débute en Python, ne dois-je pas commencer directement en Python 3 ??

Tu disposeras d'énormément de ressources pour la version 2.7, ce n'est pas forcément un mauvais choix.  smile


I'd love to change the world
But I don't know what to do
So I'll leave it up to you...

logo-sur-fond.png

Hors ligne

#17 18-07-2015 07:58:41

Orsam999
Membre
Distrib. : Debian 10 (Buster)
Noyau : Linux 4.19.0-5-amd64
Inscription : 16-01-2015

Re : Bash communication MySQL

Bonjour,

Oui, apparemment la version 2.7 est installée avec Debian 7.

Celui qui ne progresse pas chaque jour, recule chaque jour.
Confucius

Hors ligne

#18 18-07-2015 09:41:05

captnfab
Admin-Girafe
Lieu : /dev/random
Distrib. : Debian
Noyau : Dur
(G)UI : gui gui, je zuis un doiseau
Inscription : 07-07-2008
Site Web

Re : Bash communication MySQL

Plop Orsam999,
Oui, il y avait beaucoup d'info là smile
Pour rendre un ficher « monscript.sh » exécutable, il suffit de faire, depuis le dossier où il est enregistré :

chmod +x monscript.sh



Pour installer python3 (python2.7 est en cours de déprécation, vu qu'il n'y a pas trop de différences apparentes entre 2.7 et 3, ce n'est pas très important, mais bon, je te recommande plutôt le 3.

apt-get install python3



#!/usr/bin/env python3


est une version plus portable de « #!/usrb/bin/python3 ». En effet, python3 peut être installé à différents endroits, mais env est toujours dans /usr/bin/,

#!/usr/bin/zsh


est juste un autre shell, comme bash et dash.


captnfab,
Association Debian-Facile, bépo.
TheDoctor: Your wish is my command… But be careful what you wish for.

Hors ligne

#19 18-07-2015 10:19:16

paskal
autobahn
Lieu : ailleurs
Inscription : 14-06-2011
Site Web

Re : Bash communication MySQL

Il y a suffisamment de différences entre Python 3 et 2.7 pour qu'on ait changé de version et non de release.
Et d'ici à ce que 2.7 soit dépréciée, Orsam999 aura eu le temps de maïtriser Modula-3, C# et Ada.  smile

I'd love to change the world
But I don't know what to do
So I'll leave it up to you...

logo-sur-fond.png

Hors ligne

#20 18-07-2015 10:25:22

captnfab
Admin-Girafe
Lieu : /dev/random
Distrib. : Debian
Noyau : Dur
(G)UI : gui gui, je zuis un doiseau
Inscription : 07-07-2008
Site Web

Re : Bash communication MySQL

Haha.

Un changement de version indique de grandes différences de code, pas de langage smile
Les différences sot principalement sous le capot.

Pourquoi se lancer dans un langage déprécié ? Python2.x l'est, à mon sens, déjà. C'est juste qu'il y a beaucoup trop de choses à migrer pour que l'on puisse simplement le retirer de la circulation.

https://wiki.python.org/moin/Python2orPython3

captnfab,
Association Debian-Facile, bépo.
TheDoctor: Your wish is my command… But be careful what you wish for.

Hors ligne

#21 18-07-2015 10:29:53

paskal
autobahn
Lieu : ailleurs
Inscription : 14-06-2011
Site Web

Re : Bash communication MySQL

Pour moi, des différences de syntaxe constituent une différence de langage ...

I'd love to change the world
But I don't know what to do
So I'll leave it up to you...

logo-sur-fond.png

Hors ligne

#22 18-07-2015 10:32:15

captnfab
Admin-Girafe
Lieu : /dev/random
Distrib. : Debian
Noyau : Dur
(G)UI : gui gui, je zuis un doiseau
Inscription : 07-07-2008
Site Web

Re : Bash communication MySQL

C'est le mot « grandes » qui était important là.

De plus, rappel de logique :
« (A implique B) et (non (A implique C)) » ne signifie pas (A implique non C)

captnfab,
Association Debian-Facile, bépo.
TheDoctor: Your wish is my command… But be careful what you wish for.

Hors ligne

Pied de page des forums