2011-05-27 13 views
25

Estoy tratando de crear un script bash que cree un usuario y una base de datos mysql pero no puedo encontrar una manera de alimentar el sql en mysql, estoy intentando con este formato:Cómo alimentar las consultas de mysql desde bash

mysql < echo "query" 

Pero eso no funciona, consulte el ejemplo siguiente:

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

cómo alimentar a MySQL con las consultas?

+0

no relacionado con la pregunta, pero también se puede ahorrar un montón de escribir mediante la creación de su anfitrión, el usuario y la contraseña en un .my .cnf archivo – Ken

+0

gracias por la sugerencia – Tirithen

Respuesta

31

Pruebe como sigue:

echo "select 1" | mysql 
5

¿Has probado mysql -e query?

19

Trate de usar un here document así:

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 

colocar Alternativamente todo lo que los comandos en el archivo de texto y ejecutarlo:

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

+1 También me gustaría mencionar que si la consulta utiliza los trazos, debe citar la etiqueta de apertura: 'mysql << 'END'' – adlawson

+0

gracias, muy útil! – KGCybeX

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

por lotes y silencio son útiles si usted está planeando pipe la salida

+0

Por documentos de mysql --batch implica silencioso. – cerd

+0

@cerd --batch sin --silent muestra encabezados de columna – Ken

8

La razón por la cual su intento no funcionó fue porque el < espera un nombre de archivo y usted le dio una cadena. Usted tendría que hacer algo como

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

sugerencia de

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

puede trabajar de ken, pero si intenta utilizar variables bash en su consulta se puede caer falta de expansión de parámetros. por ejemplo,

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

puede que no haga lo que usted espera. Una opción es utilizar

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

que funciona si la cadena de consulta contiene apropiado citar. Otra opción es el documento "aquí" según lo sugerido por dogbane.

+0

Buena explicación del error de OP. ¡Gracias por recoger las respuestas de los demás y explicar las advertencias! –

0

Para grandes consultas de una escritura del golpe, puede intentar:

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 
Cuestiones relacionadas