rlwrap: autocompletion do mysql não está funcionando

3

Normalmente, o autocompletion funciona bem no cliente da linha de comando mysql ( mysql-client-5.5 ). Eu tenho uma tabela chamada booking . Quando digito a letra b e pres TAB , o nome da minha tabela é preenchido automaticamente:

SELECT * FROM b<TAB>

No entanto, quando uso rlwrap ( alias mysql='/usr/bin/rlwrap -s 99999 -a -pRED /usr/bin/mysql' ), o preenchimento automático pára de funcionar.

Parece que rlwrap está interferindo no recurso de preenchimento automático. Alguém poderia, por favor, aconselhar como consertar isso?

Estou usando o Debian Wheezy.

UPDATE 1 :

Quando inicio meu comando com strace , ou seja:

strace /usr/bin/rlwrap -s 99999 -a -pRED /usr/bin/mysql --auto-rehash

vejo o seguinte erro

access("/usr/share/rlwrap/completions/mysql", R_OK) = -1 ENOENT (No such file or directory)

poderia ser, que o rlwrap precisa de algum arquivo com completações do mysql?

UPDATE 2

OK, criei o arquivo /usr/share/rlwrap/completions/mysql e coloquei 3 linhas de amostra lá:

select
from
where

Agora, quando eu inicio mysql e digito sele<TAB> , a guia completa a palavra select . Isso é progresso, mas isso não resolve todo o problema. Eu preciso principalmente de autocompletar para me ajudar a completar nomes obscuros de tabelas que eu não quero lembrar. Mas não consigo editar o arquivo de preenchimento automático toda vez que eu altero / adiciono / renomeio uma tabela.

Não é possível informar rlwrap para usar o mesmo arquivo de preenchimento automático que mysql faz? (Eu presumo que mysql deve usar algum arquivo desse tipo)

UPDATE 3 :

a seguir são os outros erros de strace

access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
stat("/home/martin/.terminfo", 0x7fff27ee6a70) = -1 ENOENT (No such file or directory)
access("/etc/terminfo/x/xterm-256color", R_OK) = -1 ENOENT (No such file or directory)
access("/home/martin/.mysql_completions", R_OK) = -1 ENOENT (No such file or directory)
access("/usr/share/rlwrap/completions/mysql", R_OK) = -1 ENOENT (No such file or directory)
connect(4, {sa_family=AF_FILE, path="/var/run/nscd/socket"}, 110) = -1 ENOENT (No such file or directory)
connect(4, {sa_family=AF_FILE, path="/var/run/nscd/socket"}, 110) = -1 ENOENT (No such file or directory)
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
stat("/home/martin/.inputrc", 0x7fff27ee7710) = -1 ENOENT (No such file or directory)
    
por Martin Vegter 24.10.2013 / 19:40

3 respostas

2

Isto irá permitir a conclusão no servidor mysql simples:

mysql --auto-rehash

Para rlwrap , verifique se você tem RLWRAP_HOME definido. Veja aqui para mais informações. A página também relata possíveis condições de corrida se o seu sistema estiver muito ocupado .

    
por 08.01.2014 / 05:38
1

Edite o my.cnf :

[mysql]
auto-rehash

Se isso não funcionar, adicione-o a debian.cnf .

Até você pode fazer isso:

mysql> \#
    
por 29.10.2013 / 01:00
0

Eu encontrei este bit em um fórum do FreeBSD, mas ele deve funcionar para você no seu caso também. O tópico do fórum foi intitulado: Por que não há autocompletar no mysql com o bash? .

As soluções mencionadas nesse encadeamento são as seguintes.

Opção # 1 - via cliente mysql

$ mysql --auto-rehash -p

Isso está diretamente fora da página mysql man.

--auto-rehash

Enable automatic rehashing. This option is on by default, which enables 
database, table, and column name completion. Use --disable-auto-rehash to 
disable rehashing. That causes mysql to start faster, but you must issue the 
rehash command if you want to use name completion.

To complete a name, enter the first part and press Tab. If the name is 
unambiguous, mysql completes it. Otherwise, you can press Tab again to see 
the possible names that begin with what you have typed so far. Completion 
does not occur if there is no default database.

Opção # 2 - via servidor

Você também pode corrigir isso no servidor final comentando a mesma linha de recurso no arquivo /etc/my.cnf do servidor. Depende de onde veio o seu arquivo my.cnf . O MySQL fornece vários arquivos .cnf da amostra.

Exemplo

Isto está no meu sistema CentOS, compre o seu sistema Debian, provavelmente também tem estes.

$ rpm -ql mysql-server |grep cnf 
/usr/share/doc/mysql-server-5.0.95/my-huge.cnf
/usr/share/doc/mysql-server-5.0.95/my-innodb-heavy-4G.cnf
/usr/share/doc/mysql-server-5.0.95/my-large.cnf
/usr/share/doc/mysql-server-5.0.95/my-medium.cnf
/usr/share/doc/mysql-server-5.0.95/my-small.cnf
/usr/share/mysql/my-huge.cnf
/usr/share/mysql/my-innodb-heavy-4G.cnf
/usr/share/mysql/my-large.cnf
/usr/share/mysql/my-medium.cnf
/usr/share/mysql/my-small.cnf

Se um desses arquivos for a base do seu arquivo /etc/my.cnf , você poderá ter essa linha ativada dentro dele. Por exemplo, esses arquivos estão habilitados:

$ grep rehash /usr/share/doc/mysql-server-5.0.95/*
/usr/share/doc/mysql-server-5.0.95/my-huge.cnf:no-auto-rehash
/usr/share/doc/mysql-server-5.0.95/my-innodb-heavy-4G.cnf:no-auto-rehash
/usr/share/doc/mysql-server-5.0.95/my-large.cnf:no-auto-rehash
/usr/share/doc/mysql-server-5.0.95/my-medium.cnf:no-auto-rehash
/usr/share/doc/mysql-server-5.0.95/my-small.cnf:no-auto-rehash

Então, você desejará comentar esta linha se tiver ativado em seu arquivo /etc/my.cnf , da seguinte forma:

#no-auto-rehash

Seu alias

Dado o método que você está empregando para chamar o cliente mysql usando rlwrap , você pode acrescentar os --auto-hash -p a ele da seguinte forma:

$ alias mysql='/usr/bin/rlwrap -s 99999 -a -pRED /usr/bin/mysql --auto-rehash -p'
    
por 09.01.2014 / 07:53