2011-05-27 4 views
25

Sto cercando di creare uno script bash che crea un utente e un database mysql ma non riesco a trovare un modo per alimentare sql in mysql, sto provando con questo formato:Come inviare query mysql da bash

mysql < echo "query" 

Ma questo non funziona, vedere l'esempio di seguito:

mysql --host=localhost --user=user --password=password < echo "CREATE USER 'testuser'@'localhost' IDENTIFIED BY 'jakdJxct8W'; 
CREATE DATABASE IF NOT EXISTS 'testuser_dev' DEFAULT CHARACTER SET utf8 COLLATE utf8_bin; 
GRANT ALL PRIVILEGES ON 'testuser_dev' . * TO 'testuser'@'localhost'; 
CREATE DATABASE IF NOT EXISTS 'testuser_qa' DEFAULT CHARACTER SET utf8 COLLATE utf8_bin; 
GRANT ALL PRIVILEGES ON 'testuser_qa' . * TO 'testuser'@'localhost';" 

come nutrire mysql con le query?

+0

non legati alla domanda, ma si può anche risparmiare un sacco di digitazione attraverso la creazione di vostro ospite, utente e la password in un .il mio .cnf file – Ken

+0

grazie per il suggerimento – Tirithen

risposta

31

Prova come:

echo "select 1" | mysql 
5

Hai provato mysql -e query?

19

Provare a usare un here document come questo:

mysql --host=localhost --user=user --password=password << END 

CREATE USER 'testuser'@'localhost' IDENTIFIED BY 'jakdJxct8W'; 
CREATE DATABASE IF NOT EXISTS 'testuser_dev' DEFAULT CHARACTER SET utf8 COLLATE utf8_bin; 
GRANT ALL PRIVILEGES ON 'testuser_dev' . * TO 'testuser'@'localhost'; 
CREATE DATABASE IF NOT EXISTS 'testuser_qa' DEFAULT CHARACTER SET utf8 COLLATE utf8_bin; 
GRANT ALL PRIVILEGES ON 'testuser_qa' . * TO 'testuser'@'localhost'; 

END 

alternativa mettere tutto quello che comandi in file di testo ed eseguirlo:

mysql --host=localhost --user=user --password=password < commands.sql 
+2

+1 Vorrei anche ricordare che se la query utilizza i backtick, è necessario citare l'etichetta di apertura: 'mysql << 'END'' – adlawson

+0

grazie, molto utile! – KGCybeX

21
mysql --batch --silent -e 'SHOW TABLES'; 

Batch e silenziosi sono a portata di mano se si prevede di pipe the output

+0

Per mysql docs --batch implica silent. – cerd

+0

@cerd --batch senza --silent mostra le intestazioni delle colonne – Ken

8

Il motivo per cui il tuo tentativo non ha funzionato era perché il < si aspetta un nome di file e gli hai fornito una stringa. Si dovrebbe fare qualcosa di simile

echo "YOURQUERYSTRINGHERE">tmpfile 
mysql --host=localhost --user=user --password=password dbname <tmpfile 

suggerimento di ken di

mysql --host=localhost --user=user --password=password -e "QUERY" dbname 

può funzionare, ma se si tenta di utilizzare le variabili bash nella query si può cadere fallo di espansione di parametro. es.

QUERY="select * from $MYTABLE WHERE name=\"[email protected]\";" 
mysql --host=localhost --user=user --password=password -e "$QUERY" mydbname 

non può fare ciò che ci si aspetta. Una possibilità è utilizzare

echo "$QUERY"|mysql --host=localhost --user=user --password=password mydbname 

che funziona se la stringa di query contiene appropriata citando. Un'altra opzione è il documento "qui" come suggerito da dogbane.

+0

Buona spiegazione dell'errore dell'OP. Grazie per aver raccolto le risposte degli altri e aver spiegato i caveat! –

0

Per i grandi query in uno script bash, si può provare:

read -d '' SQL_QUERY_1 << EOF 

SELECT prod.id as id, prod.title as title, comp.name as company, pho.id as photo_id, pho.image as photo_name 
FROM products as prod 
JOIN accounts as comp 
ON comp.id = prod.account_id 
JOIN photos as pho 
ON pho.id = prod.featured_photo_id; 

EOF 

echo ${SQL_QUERY_1} | mysql