web-dev-qa-db-fra.com

Script Bash pour insérer des valeurs dans MySQL

Je veux créer un script bash qui se connecte à mon serveur MySQL et insère une valeur à partir d'un fichier txt. J'ai écrit ceci:

#!/bin/bash
echo "INSERT INTO test (IP,MAC,SERVER) VALUES ('cat test.txt');" | mysql -uroot -ptest test;

mais je reçois l'erreur suivante:

ERREUR 1136 (21S01) à la ligne 1: le nombre de colonnes ne correspond pas au nombre de valeurs à la ligne 1

Je suppose que l'erreur est dans mon fichier txt, mais j'ai essayé de nombreuses variantes et toujours aucun espoir de succès.

Mon fichier txt ressemble à ceci:

10.16.54.29 00: f8: e5: 33: 22: 3f marsara

14
user2642601

Essaye celui-là:

#!/bin/bash
inputfile="test.txt"
cat $inputfile | while read ip mac server; do
    echo "INSERT INTO test (IP,MAC,SERVER) VALUES ('$ip', '$mac', '$server');"
done | mysql -uroot -ptest test;

De cette façon, vous pouvez lire le fichier en streaming ainsi que l'exécution de la commande mysql.

20
fejese

En supposant que vous ayez plusieurs lignes à ajouter, vous aurez probablement besoin de LOAD DATA INFILE , pas INSERT. Le fichier source doit être sur le serveur, mais cela semble être le cas ici.

Quelque chose comme ca:

#!/bin/bash

mysql -uroot -ptest test << EOF

LOAD DATA INFILE 'test.txt'
    INTO TABLE tbl_name
    FIELDS TERMINATED BY ' ';

EOF

LOAD DATA INFILE a de nombreuses options que vous découvrirez en lisant le doc.

11
Sylvain Leroux

Vous essayez d'insérer la valeur "cat test.txt" en tant que chaîne dans la base de données dans une instruction INSERT qui nécessite 3 paramètres (IP, MAC et SERVER), c'est pourquoi vous obtenez ce message d'erreur.

Vous devez d'abord lire le fichier texte et extraire les valeurs IP, MAC et serveur, puis les utiliser dans la requête qui ressemblerait à ceci une fois rempli:

#!/bin/bash
echo "INSERT INTO test (IP,MAC,SERVER) VALUES ('10.16.54.29', '00:f8:e5:33:22:3f', 'marsara');" | mysql -uroot -ptest test;
5
Simon

J'utilise ça et ça marche:

mysql -uroot -proot < infile

ou sélectionnez d'abord la base de données

./mysql -uroot -proot db_name < infile

ou copiez le SQL entier dans le presse-papiers et collez-le avec

pbpaste > temp_infile && mysql -uroot -proot < temp_infile && rm temp_infile
3
redestructa