2011-05-27 12 views
25

Próbuję zrobić skrypt bash, który tworzy użytkownika i bazę danych mysql, ale nie mogę znaleźć sposobu na przesłanie sql do mysql, próbuję w tym formacie:Jak karmić zapytania mysql z bashu

mysql < echo "query" 

Ale to nie działa, patrz poniższy przykład:

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';" 

jak karmić mysql z zapytaniami?

+0

nie wiąże się z pytaniem, ale można też zaoszczędzić dużo pisania o konfiguracji hosta, użytkownika i hasło w .my .cnf plik – Ken

+0

dziękuję za podpowiedź – Tirithen

Odpowiedz

31

Spróbuj tego:

echo "select 1" | mysql 
5

Czy próbowałeś już mysql -e query?

19

Spróbuj użyć here document takiego:

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 

Alternatywnie umieścić wszystko co poleceń w pliku tekstowym i uruchom go:

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

+1 Chciałbym również wspomnieć, że jeśli zapytanie używa backticks, musisz zacytować otwierającą etykietę: 'mysql << 'END'' – adlawson

+0

dzięki, bardzo pomocne! – KGCybeX

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

Batch i ciche są przydatne, jeśli planują potok wyjściowy

+0

Na mysql docs - partia oznacza cichy. – cerd

+0

@cerd --batch without --silent wyświetla nagłówki kolumn – Ken

8

Powodem twoja próba nie działa tak dlatego, że < spodziewa nazwę pliku i karmione mu łańcuch. Trzeba by zrobić coś takiego

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

sugestią Kena z

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

może pracować, ale jeśli spróbujesz użyć zmiennych bash w zapytaniu można godziłoby ekspansji parametrów. np.

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

może nie spełniać Twoich oczekiwań. Jedną z opcji jest używać

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

który działa jeśli ciąg zapytania zawiera stosowne przytoczyć. Inną opcją jest dokument "tutaj", jak sugeruje dogbane.

+0

Dobre wyjaśnienie błędu OP. Dziękujemy za zbieranie odpowiedzi innych i wyjaśnianie zastrzeżeń! –

0

Dla dużych zapytań w skrypcie bash, można spróbować:

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 
Powiązane problemy