Como melhor exibição no Terminal um MySQL Select retornando muitos campos?
-
06-09-2019 - |
Pergunta
Eu estou usando PuTTY para executar:
mysql> SELECT * FROM sometable;
sometable
tem muitos campos e isso resulta em muitas colunas tentando ser exibido no terminal. O envoltório campos para a próxima linha por isso é muito difícil de alinhar títulos das colunas com valores de campo.
Que soluções estão lá para ver esses dados no terminal?
Eu não tenho nem querem ter acesso a phpMyAdmin - ou quaisquer outras interfaces GUI. Estou à procura de soluções de linha de comando como este: resultados Guardar MySQL consulta em texto ou CVS arquivo
Solução
Terminar a consulta com \G
no lugar de ;
. Por exemplo:
SELECT * FROM sometable\G
Essa consulta exibe as linhas na vertical, como este:
*************************** 1. row ***************************
Host: localhost
Db: mydatabase1
User: myuser1
Select_priv: Y
Insert_priv: Y
Update_priv: Y
...
*************************** 2. row ***************************
Host: localhost
Db: mydatabase2
User: myuser2
Select_priv: Y
Insert_priv: Y
Update_priv: Y
...
Outras dicas
Você também pode encontrar este útil (não somente para Windows):
mysql> pager less -SFX
mysql> SELECT * FROM sometable;
Este tubo vontade outut através da ferramenta de linha de comando less
que - com esses parâmetros -. Vai lhe dar uma saída tabular que pode ser rolada horizontalmente e verticalmente com as teclas do cursor
Deixe este ponto de vista pressionando a tecla q
, que vai encerrar a ferramenta less
.
Tente ativar o modo vertical, utilizando \G
para executar a consulta em vez de ;
:
mysql> SELECT * FROM sometable \G
Os seus resultados serão listados no modo vertical, de modo que cada valor de coluna serão impressos numa linha separada. A saída será mais estreito, mas, obviamente, muito mais tempo.
Você pode usar a opção --table
ou -t
, que a saída de um olhando agradável conjunto de resultados vontade
echo 'desc table_name' | mysql -uroot database -t
ou algum outro método para passar uma consulta para mysql, como:
mysql -uroot table_name --table < /tmp/somequery.sql
saída:
+--------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| username | varchar(30) | NO | UNI | NULL | |
| first_name | varchar(30) | NO | | NULL | |
| last_name | varchar(30) | NO | | NULL | |
| email | varchar(75) | NO | | NULL | |
| password | varchar(128) | NO | | NULL | |
| is_staff | tinyint(1) | NO | | NULL | |
| is_active | tinyint(1) | NO | | NULL | |
| is_superuser | tinyint(1) | NO | | NULL | |
| last_login | datetime | NO | | NULL | |
| date_joined | datetime | NO | | NULL | |
+--------------+--------------+------+-----+---------+----------------+
comando mysql
Usando de ego
De comando mysql
de help
:
ego (\ G) Enviar comando para servidor mysql, resultado apresentado na vertical.
Assim, anexando um \G
ao seu select
, você pode obter uma saída vertical muito limpo:
mysql> SELECT * FROM sometable \G;
Usando um pager
Você pode dizer ao MySQL para usar o pager less
com a sua opção -S
que corta linhas largas e dá-lhe uma saída que pode deslocar-se com as teclas de setas:
mysql> pager less -S
Assim, da próxima vez que você executar um comando com uma saída de largura, MySQL permitirá que você navegue a saída com o pager less
:
mysql> SELECT * FROM sometable;
Se você é feito com o pager e quero voltar para a saída regular sobre stdout
, use o seguinte:
mysql> nopager
O pager padrão é stdout. A saída padrão tem a limitação da coluna, de modo que a saída seria enrolado. Você pode definir outras ferramentas como pager para formatar a saída. Existem dois métodos. Uma é a de limitar a coluna, o outro é para a processou no vim.
O primeiro método:
➜ ~ echo $COLUMNS
179
mysql> nopager
PAGER set to stdout
mysql> pager cut -c -179
PAGER set to 'cut -c -179'
mysql> select * from db;
+-----------+------------+------------+-------------+-------------+-------------+-------------+-------------+-----------+------------+-----------------+------------+------------+-
| Host | Db | User | Select_priv | Insert_priv | Update_priv | Delete_priv | Create_priv | Drop_priv | Grant_priv | References_priv | Index_priv | Alter_priv |
+-----------+------------+------------+-------------+-------------+-------------+-------------+-------------+-----------+------------+-----------------+------------+------------+-
| % | test | | Y | Y | Y | Y | Y | Y | N | Y | Y | Y |
| % | test\_% | | Y | Y | Y | Y | Y | Y | N | Y | Y | Y |
| localhost | phpmyadmin | phpmyadmin | Y | Y | Y | Y | Y | Y | N | Y | Y | Y |
| localhost | it | it | Y | Y | Y | Y | Y | Y | N | Y | Y | Y |
+-----------+------------+------------+-------------+-------------+-------------+-------------+-------------+-----------+------------+-----------------+------------+------------+-
4 rows in set (0.00 sec)
mysql>
A saída não está completa. Os ajustes de conteúdo para sua tela.
O segundo:
Set vim para o modo de nowrap em seu .vimrc
➜ ~ tail ~/.vimrc
" no-wrap for myslq cli
set nowrap
mysql> pager vim -
PAGER set to 'vim -'
mysql> select * from db;
Vim: Reading from stdin...
+-----------+------------+------------+-------------+-------------+----------
| Host | Db | User | Select_priv | Insert_priv | Update_pr
+-----------+------------+------------+-------------+-------------+----------
| % | test | | Y | Y | Y
| % | test\_% | | Y | Y | Y
| localhost | phpmyadmin | phpmyadmin | Y | Y | Y
| localhost | it | it | Y | Y | Y
+-----------+------------+------------+-------------+-------------+----------
~
~
~
Apenas para complementar a resposta que eu pensei melhor, eu também uso less -SFX
mas de uma maneira diferente: Eu gosto de ad-lo para o meu arquivo .my.cnf
na minha pasta pessoal, um exemplo CNF olhares de arquivo como este:
[client]
user=root
password=MyPwD
[mysql]
pager='less -SFX'
A boa coisa sobre ter isto deste modo, é que less
só é usado quando a saída de uma consulta é na verdade mais de uma página, aqui está a explicação de todas as bandeiras:
- -S:. Única linha, não pule linha quando a linha é maior do que a tela, em vez permitem deslocar para a direita ??li>
- F:. Sair se uma tela , se o conteúdo não precisa de rolagem em seguida, basta enviar para stdout
- X: No init, desativa qualquer saída "menos" pode ter configurado para a saída cada vez que ele carrega .
Nota: no arquivo .my.cnf
não colocar o comando pager
abaixo a palavra-chave [client]
; embora possa trabalhar com mysql
bem, mysqldump
vai se queixam de não reconhecê-lo.
Se você estiver usando MySQL interativamente, você pode definir o seu pager para uso sed
assim:
$ mysql -u <user> p<password>
mysql> pager sed 's/,/\n/g'
PAGER set to 'sed 's/,/\n/g''
mysql> SELECT blah FROM blah WHERE blah = blah
.
.
.
"blah":"blah"
"blah":"blah"
"blah":"blah"
Se você não usar sed
como o pager, a saída é assim:
"blah":"blah","blah":"blah","blah":"blah"
Eu escrevi pspg
- https://github.com/okbob/pspg
Este pager é projetado para dados tabulares -. E MySQL é suportado demasiado
MariaDB [sakila]> pager pspg -s 14 -X --force-uniborder --quit-if-one-screen PAGER set to 'pspg -s 14 -X --force-uniborder --quit-if-one-screen' MariaDB [sakila]> select now(); MariaDB [sakila]> select * from nicer_but_slower_film_list limit 100;
Eu acredito massa tem um número máximo de colunas que você pode especificar para a janela.
Para o Windows eu, pessoalmente, usa o Windows PowerShell e definir tampão largura razoavelmente alto da tela. A coluna largura permanece fixo e você pode usar a barra de rolagem horizontal para ver os dados. Eu tive o mesmo problema que você está tendo agora.
edit: Para hosts remotos que você tem que SSH para você usaria algo como plink + Windows PowerShell
Você pode usar tee
para escrever o resultado de sua consulta para um arquivo:
tee somepath\filename.txt
Usando o comando do Windows solicitar que você pode aumentar o tamanho do buffer da janela tanto que você quer ver o número de colunas. Isso depende do nº de colunas na tabela.