Lecture en boucle dans une table mysql

Fermé
xunil2003 - 24 oct. 2013 à 10:10
mamiemando Messages postés 33623 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 11 avril 2025 - 27 oct. 2013 à 23:56
Bonjour,

J'ai fait un script bash pour ma table mysql


Script
echo ""
echo Relevé des sondes effectué le $(date +%d/%m/%Y) à $(date +%H:%M)

noms_colonnes="name,id_zwave,room"
REQUETE=$(mysql -h "$hote_db" -D "$nom_bd" -u "$login_db" -p"$pass_bd" \
--default-character-set=$format_texte -e "SELECT $noms_colonnes FROM $nom_table ")
for SQL in $REQUETE

do

name ()
{
noms_colonnes=name
mysql -h "$hote_db" -D "$nom_bd" -u "$login_db" -p"$pass_bd" \
--default-character-set=$format_texte -e "SELECT $noms_colonnes FROM $nom_table "
}
#echo "name : $(name)"

idx ()
{
noms_colonnes=id
mysql -h "$hote_db" -D "$nom_bd" -u "$login_db" -p"$pass_bd" \
--default-character-set=$format_texte -e "SELECT $noms_colonnes FROM $nom_table "
}
#echo "name : $(id)"

room ()
{
noms_colonnes=room
mysql -h "$hote_db" -D "$nom_bd" -u "$login_db" -p"$pass_bd" \
--default-character-set=$format_texte -e "SELECT $noms_colonnes FROM $nom_table "
}
#echo "name : $(room)"


echo ""
echo "Pièce : $(room)"
echo "Nom : $(name)"
echo "Id : $(idx)"

donne

exit 0

Le résultat il s'affiche comme ceci :
Relevé des sondes effectué le 24/10/2013 à 09:49

Pièce : room
0
Jardin du haut
Cuisine d'été (R.D.C)
Buanderie (R.D.C)
Jardin du haut
Chambre des invités (RDC
Chambre parent (1er étag
Salon (1er étage)
Buanderie (R.D.C)
Cuisine d'été (R.D.C)
Bureau (R.D.C)
Chambre des invités (RDC
Chambre Loïc (1er étage)
Salon (1er étage)
Jardin du haut
Jardin du haut
Bureau (R.D.C)
Chambre des invités (RDC
S.D.B (1er étage)
Salon (1er étage)
Véranda (1er étage)
Chambre des invités (RDC
Véranda (1er étage)
Salon (1er étage)
S.D.B (1er étage)
Bureau (R.D.C)
Chambre des invités (RDC
S.D.B (1er étage)
Salon (1er étage)
Véranda (1er étage)
Bureau (R.D.C)
0
0
Nom : name
Battery Monitor
Capteur 4 en 1 (mouvement)
Congélateur
Cumulus
Détecteur 4 en 1 (lumière)
Ensemble TV Chambre des invités
Ensemble TV chambre des parents
Lampadaire
Lave linge
Lave vaiselle
Lumière bureau serveur
Lumière variateur
Prises bureau chambre de Loïc
Samsung TV Remote
Sonde 4 en 1 (température)
Sonde 4 en 1 Humidite
Sonde Accus Bureau
Sonde Accus Chambre des invités
Sonde Accus S.D.B
Sonde Accus Salon (1er étage)
Sonde Accus Veranda
Sonde Humidite Chambre des invités
Sonde Humidite Veranda
Sonde Humidity Salon
Sonde Humidité S.D.B
Sonde Temperature Bureau
Sonde Temperature Chambre des invités
Sonde Temperature S.D.B
Sonde Temperature Salon
Sonde Temperature Veranda
Sondes Humidite Bureau
VeraAlerts
Webcall Dialer
Id : id
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
/home/serveur/vera/vera-sonde-tem-hum-2.sh: line 64: donne : commande introuvable
serveur@debian:~$

Au lieu de s'afficher comme ceci :

Relevé des sondes effectué le 24/10/2013 à 09:49

Pièce : 0
Nom : Battery Monitor
Id: 1

Pièce : Jardin du haut
Nom : Capteur 4 en 1 (mouvement)
Id:2

Pièce : Cuisine d'été (R.D.C)
Nom : Congélateur
Id: 3

Pièce : Buanderie (R.D.C)
Nom : Cumulus
Id:4

Pièce : Jardin du haut
Nom : Détecteur 4 en 1 (lumière)
Id: 5

etc...

Comment dois-je faire ?
Merci.
A voir également:

7 réponses

mamiemando Messages postés 33623 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 11 avril 2025 7 840
Modifié par mamiemando le 25/10/2013 à 11:26
Le programme en lui-même est assez "choquant" en terme de performances car tu vas initier une connexion et une requête sql par "case" de table à récupérer (nombre de ligne x nombre de colonnes requêtes) ce qui est vraiment pas super.

Selon moi il faut que tu récupères les records qui t'intéressent dans une liste, puis que tu itères sur cette liste pour afficher chaque record à ton idée.

Personnellement je ne le ferais pas en shell, car même si c'est faisable, c'est assez pénible à écrire. Un langage de script (par exemple python) et une surcouche sur ton sgbd (python-mysql) me paraissent bien plus pratiques...
http://zetcode.com/db/mysqlpython/

Bonne chance
0
Bonjour,

Je n'ai fait aucune "case" dans mon script ???
Personnellement je n'ai jamais fait de python , et pour l'instant même si c'est assez pénible à écrire en bash, je préfère y réaliser en bash afin d'assimiler correctement le langage.

Quand vous dite :
Selon moi il faut que tu récupères les records qui t'intéressent dans une liste, puis que tu itères sur cette liste pour afficher chaque record à ton idée.
Vous voulez dire dans un tableau ou un fichier.

merci.
0
mamiemando Messages postés 33623 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 11 avril 2025 7 840
26 oct. 2013 à 01:54
Hello on s'est mal compris.

Ce que j'appelais "case" est un champ d'un record (ce qui correspond bien à une case si une table est vue comme un tableau constitué de lignes (les records) et de columns (les champs)). (Mais j'ai fait une erreur dans mon précédent tu génères simplement une requête par colonne, pas une par case).

Dans ton cas tu es intéressé par trois colonnes (name, id, room). Tu engendres donc trois requêtes là ou une suffit. De plus cela part du principe que les valeurs sortent de manière consistente pour les trois requêtes, de sorte que la 1ère valeur d'une requête corresponde bien avec celle de la 2e et 3e colonne. Même si c'est sans doute le cas, c'est risqué.

Si tu veux vraiment le faire en shell, fais carrément une requête mysql sur ces trois colonnes et "pipe" le résultat, au moins tu es sûr que ça se passera bien, par exemple en écrivant quelque chose de ce genre

mysql -h "$hote_db" -D "$nom_bd" -u "$login_db" -p"$pass_bd" \
--default-character-set=$format_texte -e "SELECT name, id, room FROM $nom_table " | awk '{print "NAME", $1, "ID:", $2, "ROOM:", $3;}'

Bonne chance
0
Bonjour,

Voila ma table :

select_noms_colonnes="name,id_zwave,room"
nom_table="vera"
colonne_recherche="name"
recherche="sonde "

mysql -h "$hote_db" -D "$nom_bd" -u "$login_db" -p"$pass_bd" \
--default-character-set=$format_texte -e "SELECT $select_noms_colonnes FROM $nom_table WHERE $colonne_recherche LIKE '$recherche%'"
+----------------------------------------+----------+---------------------------+
| name | id_zwave | room |
+----------------------------------------+----------+---------------------------+
| Sonde 4 en 1 (température) | 44 | Jardin du haut |
| Sonde 4 en 1 Humidite | 46 | Jardin du haut |
| Sonde Accus Bureau | 36 | Bureau (R.D.C) |
| Sonde Accus Chambre des invités | 52 | Chambre des invités (RDC |
| Sonde Accus S.D.B | 48 | S.D.B (1er étage) |
| Sonde Accus Salon (1er étage) | 13 | Salon (1er étage) |
| Sonde Accus Veranda | 59 | Véranda (1er étage) |
| Sonde Humidite Chambre des invités | 54 | Chambre des invités (RDC |
| Sonde Humidite Veranda | 61 | Véranda (1er étage) |
| Sonde Humidity Salon | 15 | Salon (1er étage) |
| Sonde Humidité S.D.B | 50 | S.D.B (1er étage) |
| Sonde Temperature Bureau | 37 | Bureau (R.D.C) |
| Sonde Temperature Chambre des invités | 53 | Chambre des invités (RDC |
| Sonde Temperature S.D.B | 49 | S.D.B (1er étage) |
| Sonde Temperature Salon | 14 | Salon (1er étage) |
| Sonde Temperature Veranda | 60 | Véranda (1er étage) |
+----------------------------------------+----------+---------------------------+

Avec votre solution j'obtiens le résultat suivant :
    mysql -h "$hote_db" -D "$nom_bd" -u "$login_db" -p"$pass_bd" \
--default-character-set=$format_texte -e "SELECT $select_noms_colonnes FROM $nom_table WHERE $colonne_recherche LIKE '$recherche%'" | awk '{print "NAME ", $1, "ID:", $2, "ROOM:", $3; }'

NAME name ID: id_zwave ROOM: room
NAME Sonde ID: 4 ROOM: en
NAME Sonde ID: 4 ROOM: en
NAME Sonde ID: Accus ROOM: Bureau
NAME Sonde ID: Accus ROOM: Chambre
NAME Sonde ID: Accus ROOM: S.D.B
NAME Sonde ID: Accus ROOM: Salon
NAME Sonde ID: Accus ROOM: Veranda
NAME Sonde ID: Humidite ROOM: Chambre
NAME Sonde ID: Humidite ROOM: Veranda
NAME Sonde ID: Humidity ROOM: Salon
NAME Sonde ID: Humidité ROOM: S.D.B
NAME Sonde ID: Temperature ROOM: Bureau
NAME Sonde ID: Temperature ROOM: Chambre
NAME Sonde ID: Temperature ROOM: S.D.B
NAME Sonde ID: Temperature ROOM: Salon
NAME Sonde ID: Temperature ROOM: Veranda

ors je n'arrive pas à obtenir le résultat suivant :

NAME : Sonde 4 en 1 (température) 
ID : 44
ROOM : Jardin du haut

NAME : Sonde 4 en 1 Humidite
ID : 46
ROOM : Jardin du haut

NAME : Sonde Accus Bureau
ID : 36
ROOM : Bureau (R.D.C)

NAME : Sonde Accus Chambre des invités
ID : 52
ROOM : Chambre des invités (RDC

NAME : Sonde Accus S.D.B
ID : 48
ROOM : S.D.B (1er étage)

ETC....

Ne vaut-il pas mieux utiliser "sed" au lieu de "awk" ?

Merci.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
mamiemando Messages postés 33623 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 11 avril 2025 7 840
27 oct. 2013 à 01:02
Ne vaut-il pas mieux utiliser "sed" au lieu de "awk" ?

Disons que awk permet de faire plus de choses, mais si sed est suffisant, pourquoi ne pas utiliser sed.

Pour revenir à la syntaxe awk il suffit de rajouter des retours à la ligne ou de faire plusieurs print.

mysql -h "$hote_db" -D "$nom_bd" -u "$login_db" -p"$pass_bd" \
--default-character-set=$format_texte -e "SELECT name, id, room FROM $nom_table " | awk '{print "NAME", $1; print "ID:", $2; print "ROOM:", $3;}'

En fait il faut bien comprendre que awk a une syntaxe fortement inspirée du C et que c'est vraiment un langage de programmation. Là il se trouve qu'on écrit tout sur une ligne qu'on passe en paramètre à awk, mais si on devrait écrire le script correspondant on écrirait, par exemple :

{
print "NAME", $1;
print "ID:", $2;
print "ROOM:", $3;
}

Bonne chance
0
xunil2003 Messages postés 766 Date d'inscription mercredi 17 novembre 2004 Statut Membre Dernière intervention 29 septembre 2024 14
27 oct. 2013 à 14:50
Bonjour,

Je ne comprend pas avec awk comment afficher au complet la phrase.

Exemple, ici il y a la phase entière de name :

mysql -h "$hote_db" -D "$nom_bd" -u "$login_db" -p"$pass_bd" \
--default-character-set=$format_texte -e "SELECT $select_noms_colonnes FROM $nom_table WHERE $colonne_recherche LIKE '$recherche%'"

+----------------------------------------+----------+---------------------------+
| name | id_zwave | room |
+----------------------------------------+----------+---------------------------+
| Sonde 4 en 1 (température) | 44 | Jardin du haut |
| Sonde 4 en 1 Humidite | 46 | Jardin du haut |
| Sonde Accus Bureau | 36 | Bureau (R.D.C) |
| Sonde Accus Chambre des invités | 52 | Chambre des invités (RDC |
| Sonde Accus S.D.B | 48 | S.D.B (1er étage) |
| Sonde Accus Salon (1er étage) | 13 | Salon (1er étage) |
| Sonde Accus Veranda | 59 | Véranda (1er étage) |
| Sonde Humidite Chambre des invités | 54 | Chambre des invités (RDC |
| Sonde Humidite Veranda | 61 | Véranda (1er étage) |
| Sonde Humidity Salon | 15 | Salon (1er étage) |
| Sonde Humidité S.D.B | 50 | S.D.B (1er étage) |
| Sonde Temperature Bureau | 37 | Bureau (R.D.C) |
| Sonde Temperature Chambre des invités | 53 | Chambre des invités (RDC |
| Sonde Temperature S.D.B | 49 | S.D.B (1er étage) |
| Sonde Temperature Salon | 14 | Salon (1er étage) |
| Sonde Temperature Veranda | 60 | Véranda (1er étage) |
+----------------------------------------+----------+---------------------------+

Alors qu'ici non
mysql -h "$hote_db" -D "$nom_bd" -u "$login_db" -p"$pass_bd" \
--default-character-set=$format_texte -e "SELECT $select_noms_colonnes FROM $nom_table WHERE $colonne_recherche LIKE '$recherche%'" | awk '{print "NAME", $1; print "ID:", $2; print "ROOM:", $3;}'

NAME name
ID: id_zwave
ROOM: room
NAME Sonde
ID: 4
ROOM: en
NAME Sonde
ID: 4
ROOM: en
NAME Sonde
ID: Accus
ROOM: Bureau
NAME Sonde
ID: Accus
ROOM: Chambre
NAME Sonde
ID: Accus
ROOM: S.D.B
NAME Sonde
ID: Accus
ROOM: Salon
NAME Sonde
ID: Accus
ROOM: Veranda
NAME Sonde
ID: Humidite
ROOM: Chambre
NAME Sonde
ID: Humidite
ROOM: Veranda
NAME Sonde
ID: Humidity
ROOM: Salon
NAME Sonde
ID: Humidité
ROOM: S.D.B
NAME Sonde
ID: Temperature
ROOM: Bureau
NAME Sonde
ID: Temperature
ROOM: Chambre
NAME Sonde
ID: Temperature
ROOM: S.D.B
NAME Sonde
ID: Temperature
ROOM: Salon
NAME Sonde
ID: Temperature
ROOM: Veranda

Pourquoi le champs "name" n'affiche pas la phrase entière et y décale, comment y rectifier ?

Merci
0
mamiemando Messages postés 33623 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 11 avril 2025 7 840
27 oct. 2013 à 23:56
En awk tu précises quel caractère sert de séparateur (par défaut tabulation je crois) a l'aide de la variable IFS.
http://www.gnu.org/software/gawk/manual/html_node/Field-Separators.html

Dans ton cas l'IFS doit correspondre au caractère qui sépare une colonne (piège, le caractère "|" n'est pas le séparateur de colonne reçu au travers d'un pipe). Pour voir les lignes que reçoit awk :

ma_commande | awk '{print "input:", $0}'

Bonne chance
0