¿Hay una manera fácil de ejecutar una consulta MySQL desde la línea de comandos de Linux y generar los resultados en formato CSV ?
Esto es lo que estoy haciendo ahora:
mysql -u uid -ppwd -D dbname << EOQ | sed -e 's/ /,/g' | tee list.csv
select id, concat("\"",name,"\"") as name
from students
EOQ
Se vuelve desordenado cuando hay muchas columnas que deben estar entre comillas, o si hay comillas en los resultados que deben escaparse.
REPLACE()
en su consulta para que las comillas escapen.Respuestas:
De http://www.tech-recipes.com/rx/1475/save-mysql-query-results-into-a-text-or-csv-file/
Con este comando, los nombres de las columnas no se exportarán.
También tenga en cuenta que
/var/lib/mysql-files/orders.csv
estará en el servidor que ejecuta MySQL. El usuario con el que se ejecuta el proceso MySQL debe tener permisos para escribir en el directorio elegido, o el comando fallará.Si desea escribir la salida en su máquina local desde un servidor remoto (especialmente una máquina alojada o virtualizada como Heroku o Amazon RDS), esta solución no es adecuada.
fuente
Que está separado por tabuladores. Canalícelo así para obtener un verdadero CSV (gracias @therefromhere):
fuente
| sed 's/\t/,/g'
Esto le dará un archivo separado por tabulaciones. Como las comas (o cadenas que contienen comas) no se escapan, no es sencillo cambiar el delimitador a coma.
fuente
Aquí hay una manera bastante retorcida de hacerlo. Lo encontré en alguna parte, no puedo tomar ningún crédito
mysql --user=wibble --password wobble -B -e "select * from vehicle_categories;" | sed "s/'/\'/;s/\t/\",\"/g;s/^/\"/;s/$/\"/;s/\n//g" > vehicle_categories.csv
Funciona bastante bien Una vez más, aunque una expresión regular demuestra que solo se escribe.
Explicación de expresiones regulares:
Entonces, poniéndolo todo junto:
fuente
mysql -B
. Si separa la expresión regular en declaraciones individuales en líneas separadas, sería bastante simple (para alguien que conoce la expresión regular) entender.","
y varias otras cosas. Una expresión regular no es la forma de resolver este problemaSolo Unix / Cygwin , canalícelo a través de 'tr':
NB: Esto no maneja ni comas incrustadas ni pestañas incrustadas.
fuente
Esto me salvó un par de veces. ¡Rápido y funciona!
Ejemplo:
Para completar, puede convertir a csv (pero tenga cuidado porque las pestañas pueden estar dentro de los valores de campo, por ejemplo, campos de texto)
fuente
La solución OUTFILE dada por Paul Tomblin hace que se escriba un archivo en el servidor MySQL, por lo que solo funcionará si tiene acceso a ARCHIVO , así como acceso de inicio de sesión u otros medios para recuperar el archivo de ese cuadro.
Si no tiene ese acceso, y la salida delimitada por tabulaciones es un sustituto razonable de CSV (por ejemplo, si su objetivo final es importar a Excel), entonces la solución de Serbaut (usando
mysql --batch
y opcionalmente--raw
) es el camino a seguir.fuente
MySQL Workbench puede exportar conjuntos de registros a CSV, y parece manejar muy bien las comas en los campos. El CSV se abre en OpenOffice bien.
fuente
Qué tal si:
fuente
mysql -uUser -pPassword your_database < my_requests.sql | awk 'BEGIN{OFS="=";} {print $1,$2}' > out.csv
Todas las soluciones hasta la fecha, excepto la de MySQL workbench, son incorrectas y posiblemente inseguras (es decir, problemas de seguridad) para al menos algún contenido posible en el mysql db.
MYSQL Workbench (y de manera similar PHPMyAdmin) proporcionan una solución formalmente correcta, pero están diseñados para descargar la salida a la ubicación de un usuario. No son tan útiles para cosas como automatizar la exportación de datos.
No es posible generar csv correctamente confiable a partir de la salida de
mysql -B -e 'SELECT ...'
porque eso no puede codificar retornos de carro y espacios en blanco en los campos. El indicador '-s' a mysql sí hace un escape de barra invertida, y podría conducir a una solución correcta. Sin embargo, el uso de un lenguaje de secuencias de comandos (uno con estructuras de datos internas decentes, es decir, no bash) y las bibliotecas donde los problemas de codificación ya se han resuelto cuidadosamente es mucho más seguro.Pensé en escribir un guión para esto, pero tan pronto como pensé en cómo lo llamaría, se me ocurrió buscar trabajo preexistente con el mismo nombre. Si bien no lo he revisado a fondo, la solución en https://github.com/robmiller/mysql2csv parece prometedora. Dependiendo de su aplicación, el enfoque yaml para especificar los comandos SQL puede o no ser atractivo. Tampoco me entusiasma el requisito de una versión más reciente de ruby que la que viene de serie con mi computadora portátil Ubuntu 12.04 o mis servidores Debian Squeeze. Sí, sé que podría usar RVM, pero prefiero no mantenerlo con un propósito tan simple.
Esperemos que alguien señale una herramienta adecuada, que ha tenido algunas pruebas. De lo contrario, probablemente actualizaré esto cuando encuentre o escriba uno.
fuente
Muchas de las respuestas en esta página son débiles porque no manejan el caso general de lo que puede ocurrir en formato CSV. por ejemplo, comas y comillas incrustadas en campos y otras condiciones que siempre aparecen eventualmente. Necesitamos una solución general que funcione para todos los datos de entrada CSV válidos.
Aquí hay una solución simple y fuerte en Python:
Asigne un nombre a ese archivo
tab2csv
, póngalo en su ruta, dele permisos de ejecución y luego utilícelo así:Las funciones de manejo de Python CSV cubren casos de esquina para los formatos de entrada CSV.
Esto podría mejorarse para manejar archivos muy grandes a través de un enfoque de transmisión.
fuente
Desde su línea de comando, puede hacer esto:
Créditos: Exportar tabla de Amazon RDS a un archivo csv
fuente
CREATE TABLE () (SELECT data FROM other_table ) ENGINE=CSV ;
fuente
Esta respuesta usa Python y una biblioteca popular de terceros, PyMySQL . Lo estoy agregando porque la biblioteca csv de Python es lo suficientemente potente como para manejar correctamente muchos sabores diferentes
.csv
y ninguna otra respuesta está usando el código Python para interactuar con la base de datos.fuente
Esto es simple y funciona en cualquier cosa sin necesidad de modo por lotes o archivos de salida:
Explicación:
"
con""
en cada campo ->replace(field1, '"', '""')
concat('"', result1, '"')
concat_ws(',', quoted1, quoted2, ...)
¡Eso es!
fuente
NULL
se omitirán los valores, lo que dará comoconcat_ws()
resultado un desajuste de columna. Para evitar esto, simplemente use una cadena vacía en su lugar:IFNULL(field, '')
(o cualquier otra cosa que use para representarNULL
)Alternativamente a la respuesta anterior, puede tener una tabla MySQL que use el motor CSV.
Luego, tendrá un archivo en su disco duro que siempre estará en formato CSV que podría copiar sin procesarlo.
fuente
Para ampliar las respuestas anteriores, el siguiente one-liner exporta una sola tabla como un archivo separado por tabuladores. Es adecuado para la automatización, exportando la base de datos todos los días más o menos.
Convenientemente, podemos usar la misma técnica para enumerar las tablas de MySQL y describir los campos en una sola tabla:
fuente
mysql -B -D mydatabase -e 'select * from mytable' | sed -e 's/\t/,/g'
sed -e 's/\t/,/g'
solo es seguro si está seguro de que sus datos no contienen comas ni pestañas.Basándose en user7610, esta es la mejor manera de hacerlo. Con
mysql outfile
60 minutos de propiedad de archivos y problemas de sobrescritura.No es genial, pero funcionó en 5 minutos.
php csvdump.php localhost root password database tablename > whatever-you-like.csv
fuente
Además, si está realizando la consulta en la línea de comando Bash, creo que el
tr
comando puede usarse para sustituir las pestañas predeterminadas por delimitadores arbitrarios.$ echo "SELECT * FROM Table123" | mysql Database456 | tr "\t" ,
fuente
Esto es lo que hago:
La secuencia de comandos perl (franqueada desde otro lugar) hace un buen trabajo al convertir los campos con tabulaciones a CSV.
fuente
perl -F"\t" -lane 'print join ",", map {s/"/""/g; /^\d+(?:\.\d+)?$/ ? $_ : qq("$_")} @F '
- el suyo no citaría1.2.3
No exactamente como un formato CSV, pero el
tee
comando del cliente MySQL puede usarse para guardar la salida en un archivo local :Puede deshabilitarlo usando
notee
.El problema
SELECT … INTO OUTFILE …;
es que requiere permiso para escribir archivos en el servidor.fuente
Utilizando la solución publicada por Tim, creé este script bash para facilitar el proceso (se solicita la contraseña de root, pero puede modificar el script fácilmente para solicitar cualquier otro usuario):
Creará un archivo llamado: database.table.csv
fuente
Si tiene PHP configurado en el servidor, puede usar mysql2csv para exportar un archivo CSV (realmente válido) para una consulta mysql abitraria. Vea mi respuesta en MySQL: ¿SELECCIONAR * EN LOCAL DE SALIDA?para un poco más de contexto / información.
Traté de mantener los nombres de las opciones, por
mysql
lo que debería ser suficiente para proporcionar las opciones--file
y--query
:"Instalar" a
mysql2csv
través de(descargue el contenido de la esencia, verifique la suma de verificación y hágalo ejecutable).
fuente
Lo que funcionó para mí:
Ninguna de las soluciones en este hilo funcionó para mi caso particular, tenía datos bastante json dentro de una de las columnas, lo que se estropearía en mi salida de csv. Para aquellos con un problema similar, intente líneas terminadas por \ r \ n en su lugar.
También otro problema para aquellos que intentan abrir el csv con Microsoft Excel, tenga en cuenta que hay un límite de 32,767 caracteres que puede contener una sola celda, por encima de lo cual se desborda a las filas a continuación. Para identificar qué registros en una columna tienen el problema, use la consulta a continuación. Luego puede truncar esos registros o manejarlos como desee.
fuente
Si obtiene un error de
secure-file-priv
entonces, también después de cambiar la ubicación del archivo de destino dentro deC:\ProgramData\MySQL\MySQL Server 8.0\Uploads
y también después de la consulta:SELECT * FROM attendance INTO OUTFILE 'C:\ProgramData\MySQL\MySQL Server 8.0\Uploads\FileName.csv' FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n';
no funciona, solo tiene que cambiar
\
(barra diagonal inversa) de la consulta a/
(barra frontal)¡Y eso funciona!
Ejemplo:
¡Cada vez que ejecute la consulta exitosa, generará el nuevo archivo csv cada vez! ¿Guay, verdad?
fuente
Pequeño script de bash para realizar consultas simples a los volcados CSV, inspirado en https://stackoverflow.com/a/5395421/2841607 .
fuente
El siguiente script bash funciona para mí. Opcionalmente, también obtiene el esquema de las tablas solicitadas.
fuente
Encontré el mismo problema y la Respuesta de Paul no era una opción ya que era RDS. Reemplazar la pestaña con las comas no funcionó ya que los datos tenían comas y pestañas incrustadas. Descubrí que mycli, que es una alternativa directa para mysql-client, admite la salida de csv de fábrica con el
--csv
indicadorfuente
Si recibe este error mientras intenta exportar su archivo
y no puede resolver este error. Puede hacer una cosa simplemente ejecutando este script de Python
fuente
Si hay PHP instalado en la máquina que está utilizando, puede escribir un script PHP para hacerlo. Requiere que la instalación de PHP tenga instalada la extensión MySQL.
Puede llamar al intérprete PHP desde la línea de comandos de la siguiente manera:
Incluyo el
--php-ini
conmutador, porque es posible que deba usar su propia configuración de PHP que habilite la extensión MySQL. En PHP 5.3.0+, esa extensión está habilitada de manera predeterminada, por lo que ya no es necesario usar la configuración para habilitarla.Luego puede escribir su script de exportación como cualquier script PHP normal:
La ventaja de este método es que no tiene problemas con los campos varchar y de texto, que tienen texto que contiene nuevas líneas. Esos campos se citan correctamente y esas líneas nuevas en ellos serán interpretadas por el lector CSV como parte del texto, no separadores de registros. Eso es algo que es difícil de corregir después con sed más o menos.
fuente