Existe uma maneira fácil de executar uma consulta MySQL na linha de comando do Linux e gerar os resultados no formato CSV ?
Aqui está o que estou fazendo agora:
mysql -u uid -ppwd -D dbname << EOQ | sed -e 's/ /,/g' | tee list.csv
select id, concat("\"",name,"\"") as name
from students
EOQ
Fica confuso quando há muitas colunas que precisam estar entre aspas ou se há aspas nos resultados que precisam ser escapadas.
REPLACE()
em sua consulta para que as aspas não sejam exibidas.Respostas:
De http://www.tech-recipes.com/rx/1475/save-mysql-query-results-into-a-text-or-csv-file/
Usando este comando, os nomes das colunas não serão exportados.
Observe também que
/var/lib/mysql-files/orders.csv
estará no servidor que está executando o MySQL. O usuário sob o qual o processo MySQL está executando deve ter permissão para gravar no diretório escolhido, ou o comando falhará.Se você deseja gravar a saída em sua máquina local a partir de um servidor remoto (especialmente uma máquina hospedada ou virtualizada, como Heroku ou Amazon RDS), esta solução não é adequada.
fonte
Qual é a tabulação separada. Canalize assim para obter um verdadeiro CSV (obrigado @therefromhere):
fonte
| sed 's/\t/,/g'
Isso fornecerá um arquivo separado por tabulação. Como vírgulas (ou cadeias que contêm vírgula) não são escapadas, não é fácil alterar o delimitador para vírgula.
fonte
Aqui está uma maneira bastante complicada de fazê-lo. Encontrei em algum lugar, não posso receber nenhum 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 muito bem. Mais uma vez, apesar de uma regex provar apenas gravação.
Regex Explicação:
Então, juntando tudo:
fonte
mysql -B
. Se você separasse a regex em instruções individuais em linhas separadas, seria bastante simples (para alguém que conhece regex) entender.","
e várias outras coisas. A regex é não a maneira de resolver este problemaSomente Unix / Cygwin , passe através de 'tr':
Nota: trata-se nem de vírgulas incorporadas nem de separadores incorporados.
fonte
Isso me salvou algumas vezes. Rápido e funciona!
Exemplo:
Para completar, você pode converter para csv (mas tenha cuidado porque as guias podem estar dentro dos valores dos campos - por exemplo, campos de texto)
fonte
A solução OUTFILE fornecida por Paul Tomblin faz com que um arquivo seja gravado no próprio servidor MySQL, portanto, isso funcionará apenas se você tiver acesso FILE , bem como acesso de login ou outros meios para recuperar o arquivo dessa caixa.
Se você não tiver esse acesso, e a saída delimitada por tabulações for um substituto razoável para o CSV (por exemplo, se seu objetivo final for importar para o Excel), a solução da Serbaut (usando
mysql --batch
e opcionalmente--raw
) é o caminho a seguir.fonte
O MySQL Workbench pode exportar conjuntos de registros para CSV, e parece manipular vírgulas nos campos muito bem. O CSV é aberto no OpenOffice bem.
fonte
E se:
fonte
mysql -uUser -pPassword your_database < my_requests.sql | awk 'BEGIN{OFS="=";} {print $1,$2}' > out.csv
Todas as soluções aqui atualizadas, exceto a do MySQL, estão incorretas e possivelmente inseguras (ou seja, problemas de segurança) para pelo menos algum conteúdo possível no banco de dados mysql.
O MYSQL Workbench (e o PHPMyAdmin da mesma forma) fornecem uma solução formalmente correta, mas foram projetados para baixar a saída no local do usuário. Eles não são tão úteis para automatizar a exportação de dados.
Não é possível gerar csv correto e confiável a partir da saída
mysql -B -e 'SELECT ...'
porque isso não pode codificar retornos de carro e espaço em branco nos campos. O sinalizador '-s' para o mysql faz escape de barra invertida e pode levar a uma solução correta. No entanto, o uso de uma linguagem de script (uma com estruturas de dados internas decentes que não sejam o bash) e bibliotecas nas quais os problemas de codificação já foram cuidadosamente trabalhados é muito mais seguro.Pensei em escrever um script para isso, mas assim que pensei sobre o que eu chamaria, ocorreu-me procurar um trabalho preexistente com o mesmo nome. Embora eu não tenha examinado completamente, a solução em https://github.com/robmiller/mysql2csv parece promissora. Dependendo do seu aplicativo, a abordagem do yaml para especificar os comandos SQL pode ou não ser atraente. Também não estou entusiasmado com a exigência de uma versão mais recente do ruby do que o padrão no meu laptop Ubuntu 12.04 ou nos servidores Debian Squeeze. Sim, eu sei que poderia usar o RVM, mas prefiro não manter isso com um objetivo tão simples.
Espero que alguém aponte uma ferramenta adequada, que tenha sido testada um pouco. Caso contrário, provavelmente atualizarei isso quando encontrar ou escrever um.
fonte
Muitas das respostas nesta página são fracas porque não tratam do caso geral do que pode ocorrer no formato CSV. por exemplo, vírgulas e aspas incorporadas em campos e outras condições que sempre surgem eventualmente. Precisamos de uma solução geral que funcione para todos os dados de entrada CSV válidos.
Aqui está uma solução simples e forte em Python:
Nomeie esse arquivo
tab2csv
, coloque-o no seu caminho, conceda permissões de execução e use-o assim:As funções de manipulação de CSV do Python cobrem casos de canto para formatos de entrada CSV.
Isso poderia ser aprimorado para lidar com arquivos muito grandes por meio de uma abordagem de streaming.
fonte
Na sua linha de comando, você pode fazer isso:
Créditos: Exportando tabela do Amazon RDS para um arquivo csv
fonte
CREATE TABLE () (SELECT data FROM other_table ) ENGINE=CSV ;
fonte
Esta resposta usa Python e uma popular biblioteca de terceiros, PyMySQL . Estou adicionando porque a biblioteca csv do Python é poderosa o suficiente para lidar corretamente com muitos tipos diferentes
.csv
e nenhuma outra resposta está usando o código Python para interagir com o banco de dados.fonte
Isso é simples e funciona em qualquer coisa sem a necessidade de modo em lote ou arquivos de saída:
Explicação:
"
por""
em cada campo ->replace(field1, '"', '""')
concat('"', result1, '"')
concat_ws(',', quoted1, quoted2, ...)
É isso aí!
fonte
NULL
valores serão ignoradosconcat_ws()
, resultando em uma incompatibilidade de coluna. Para evitar isso, basta usar uma string vazia:IFNULL(field, '')
(ou qualquer outra coisa que você use para representarNULL
) #Como alternativa à resposta acima, você pode ter uma tabela MySQL que usa o mecanismo CSV.
Então você terá um arquivo no disco rígido que sempre estará em um formato CSV que você pode copiar sem processá-lo.
fonte
Para expandir as respostas anteriores, o one-liner a seguir exporta uma única tabela como um arquivo separado por tabulação. É adequado para automação, exportando o banco de dados todos os dias aproximadamente.
Convenientemente, podemos usar a mesma técnica para listar as tabelas do MySQL e descrever os campos em uma única tabela:
fonte
mysql -B -D mydatabase -e 'select * from mytable' | sed -e 's/\t/,/g'
sed -e 's/\t/,/g'
é seguro apenas se você tiver certeza de que seus dados não contêm vírgulas ou guias.Com base no user7610, aqui está a melhor maneira de fazer isso. Com
mysql outfile
houve 60 minutos de problemas de propriedade e substituição de arquivos.Não é legal, mas funcionou em 5 minutos.
php csvdump.php localhost root password database tablename > whatever-you-like.csv
fonte
Além disso, se você estiver executando a consulta na linha de comando do Bash, acredito que o
tr
comando possa ser usado para substituir as guias padrão por delimitadores arbitrários.$ echo "SELECT * FROM Table123" | mysql Database456 | tr "\t" ,
fonte
Aqui está o que eu faço:
O script perl (sniped de outro lugar) faz um bom trabalho de conversão dos campos espaçados por tabulação para CSV.
fonte
perl -F"\t" -lane 'print join ",", map {s/"/""/g; /^\d+(?:\.\d+)?$/ ? $_ : qq("$_")} @F '
- o seu não citaria1.2.3
Não exatamente como um formato CSV, mas o
tee
comando do cliente MySQL pode ser usado para salvar a saída em um arquivo local :Você pode desativá-lo usando
notee
.O problema
SELECT … INTO OUTFILE …;
é que ele requer permissão para gravar arquivos no servidor.fonte
Usando a solução postada por Tim, criei esse script bash para facilitar o processo (a senha root é solicitada, mas você pode modificar o script facilmente para solicitar qualquer outro usuário):
Ele criará um arquivo chamado: database.table.csv
fonte
Se você tiver o PHP configurado no servidor, poderá usar o mysql2csv para exportar um arquivo CSV (realmente válido) para uma consulta mysql abitrar. Veja minha resposta no MySQL - SELECT * IN OUTFILE LOCAL? para um pouco mais de contexto / informação.
Tentei manter os nomes das opções,
mysql
portanto, deve ser suficiente fornecer as opções--file
e--query
:"Instalar"
mysql2csv
via(faça o download do conteúdo da lista principal, verifique a soma de verificação e torne-a executável).
fonte
O que funcionou para mim:
Nenhuma das soluções neste segmento funcionou para o meu caso em particular, eu tinha dados json bastante dentro de uma das colunas, que seriam confusas na minha saída csv. Para quem tem um problema semelhante, tente as linhas terminadas por \ r \ n.
Além disso, outro problema para quem tenta abrir o csv com o Microsoft Excel, lembre-se de que existe um limite de 32.767 caracteres que uma única célula pode conter, acima do que transborda para as linhas abaixo. Para identificar quais registros em uma coluna têm o problema, use a consulta abaixo. Em seguida, você pode truncar esses registros ou manipulá-los como desejar.
fonte
Se você estiver recebendo um erro
secure-file-priv
, também, depois de mudar o local do arquivo de destino para dentroC:\ProgramData\MySQL\MySQL Server 8.0\Uploads
e também depois da consultaSELECT * FROM attendance INTO OUTFILE 'C:\ProgramData\MySQL\MySQL Server 8.0\Uploads\FileName.csv' FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n';
não está funcionando, basta alterar
\
(backsplash) da consulta para/
(forwardsplash)E isso funciona !!
Exemplo:
Cada vez que você executa a consulta bem-sucedida, ela gera o novo arquivo csv a cada vez! Legal certo?
fonte
Minúsculo script bash para fazer consultas simples a dumps CSV, inspirado em https://stackoverflow.com/a/5395421/2841607 .
fonte
O seguinte script bash funciona para mim. Opcionalmente, também obtém o esquema para as tabelas solicitadas.
fonte
Encontrei o mesmo problema e a resposta de Paulo não era uma opção, pois era o RDS. A substituição da guia pelas vírgulas não funcionou, pois os dados tinham vírgulas e guias incorporadas. Eu descobri que o mycli, que é uma alternativa drop-in para o cliente mysql, suporta saída csv fora da caixa com a
--csv
bandeirafonte
Se você estiver recebendo esse erro ao tentar exportar seu arquivo
e você não consegue resolver esse erro. Você pode fazer uma coisa simplesmente executando este script python
fonte
Se houver PHP instalado na máquina que você está usando, você pode escrever um script PHP para fazer isso. Requer que a instalação do PHP tenha a extensão MySQL instalada.
Você pode chamar o interpretador PHP a partir da linha de comando da seguinte maneira:
Estou incluindo o
--php-ini
switch, porque você pode precisar usar sua própria configuração de PHP que permite a extensão MySQL. No PHP 5.3.0+, essa extensão é ativada por padrão, de modo que não é mais necessário usar a configuração para ativá-la.Então você pode escrever seu script de exportação como qualquer script PHP normal:
A vantagem desse método é que ele não tem problemas com os campos varchar e texto, que possuem texto contendo novas linhas. Esses campos são citados corretamente e essas novas linhas serão interpretadas pelo leitor CSV como parte do texto, não como separadores de registros. Isso é algo que é difícil de corrigir depois com o sed ou algo assim.
fonte