2010-10-10 35 views
15

que he estado tratando de conseguir un script de shell (bash) para insertar una fila en una base de datos remota, pero he estado teniendo algunos problemas :(El uso de shell script para insertar datos en la base de datos MySQL remota

El script está destinado a cargar un archivo a un servidor, obtener una URL, HASH, y un tamaño de archivo, conectarse a una base de datos remota mysql, e insertar los datos en una tabla existente. He estado trabajando hasta que la base de datos MYSQL remota mordió.

Parece que este:

#!/bin/bash 

zxw=randomtext 
description=randomtext2 

for file in "[email protected]" 
do 
echo -n ***** 
ident= ***** 
data= **** 
size=` **** 
hash=`**** 
mysql --host=randomhost --user=randomuser --password=randompass randomdb 
insert into table (field1,field2,field3) values('http://www.site.com/$hash','$file','$size'); 
echo "done" 
done 

soy un novato total al programación entonces yeh: P

De todos modos, agregué el \ para escapar de los corchetes ya que estaba recibiendo errores. Como es ahora, el script funciona bien hasta que se conecta a la base de datos mysql. Simplemente se conecta a la base de datos mysql y no hace el comando de inserción (y ni siquiera sé si el comando insert funcionaría en bash).

PD: He intentado los comandos mysql desde la línea de comandos uno por uno, y funcionaron, aunque definí el hash/file/size y no tuve el escape "\".

De todos modos, ¿qué piensan? ¿Lo que estoy tratando de hacer es posible? ¿Si es así, cómo?

Cualquier ayuda se agradece :)

Respuesta

29

La instrucción de inserción debe enviarse a mysql, no a otra línea en el script de shell, por lo que debe convertirlo en un "documento aquí".

mysql --host=randomhost --user=randomuser --password=randompass randomdb << EOF 
insert into table (field1,field2,field3) values('http://www.site.com/$hash','$file','$size'); 
EOF 

Los medios << EOF toman todo antes de la próxima línea que contiene nada más que EOF (sin espacios en blanco al principio) como entrada estándar al programa.

+0

Obteniendo este error con eso: línea 22: advertencia: aquí-documento en la línea 19 delimitado por fin de archivo (deseado 'EOF ') línea 23: línea 23: error de sintaxis: inesperado final del archivo – lelouch

+2

@lelouch - usted se fue fuera del "EOF" en la tercera línea de arriba. Es importante implementar toda la solución, no solo la primera mitad. –

+0

Hmm nah, claramente agregué el << EOF en la línea mysql, y otro EOF en una nueva línea después del insert. ¿Alguna idea sobre qué está mal? – lelouch

5

No utilice SQL prima de la fiesta; bash no tiene una buena función para desinfectar los datos de antemano. Genere un archivo CSV y cárguelo en su lugar.

+0

Está destinado a ser completamente automático, con muchos archivos en proceso. Si utilizo un archivo CSV o algo, ¿no dará lugar a la posibilidad de entradas duplicadas de los mismos datos? -> disculpa mi posible ignorancia! – lelouch

+0

Si necesita que un campo o un determinado conjunto de campos sea único en toda la tabla, debe crear un índice único. –

+1

Me gustaría agregar que otra respuesta en la pila dice que no use un archivo csv.Si está conectado a una base de datos MySQL remota, entonces es difícil generar el csv localmente. Tienes que encontrar la forma de generar el csv de forma remota y luego transferirlo al directorio local. La otra respuesta recomendada tubería. Entonces, ¿cuál es? ¿Usamos csvs o no? – obesechicken13

11

Esto puede no ser exactamente lo que está buscando, pero es una opción.

Si desea omitir la molestia de incluir realmente su consulta en el script sh, puede guardar la consulta como un archivo .sql (útil a veces cuando la consulta es REALMENTE grande y complicada). Esto se puede hacer con un archivo IO simple en cualquier idioma que esté usando.

A continuación, puede incluir en su alforja sh algo como:

mysql -u youruser -p yourpass -h remoteHost < query.sql & 

Esto se conoce como la ejecución por lotes. Opcionalmente, puede incluir el signo ampersand al final para asegurarse de que esa línea del script sh no se bloquee.

Además, si le preocupan que se ingresen los mismos datos varias veces y que sus rdbms sean inconsistentes, debe explorar las transacciones de MySql (commit, rollback, etc.).

+1

Esta respuesta funciona para mí. Salida realmente limpia. – obesechicken13

Cuestiones relacionadas