org-babel e comandos sql remoto

8

Estou usando o org-babel para fazer programação alfabética e acho muito conveniente. Eu sou capaz de executar comandos shell em hosts remotos e comandos de banco de dados local com o cliente postgres. Para abrir um arquivo como usuário do postgres, pareceria, por exemplo,

C-x C-f /sshx:user@remotehost|sudo:postgres@remotehost:/tmp/testfile

Para fazer isso no Emacs 24.5.1, eu precisava adicionar:

(require 'tramp)
(add-to-list 'tramp-default-proxies-alist
             '(nil "\\`postgres\\'" "/ssh:%h:"))
(add-to-list 'tramp-default-proxies-alist
             '((regexp-quote (system-name)) nil nil))

Até agora, não consegui entender como se poderia executar um comando postgresql (ou mysql, se você escolher) em um servidor remoto. O servidor de banco de dados não está acessível diretamente pela rede, tenho que ssh no host remoto, su como o usuário do postgres e, em seguida, sou capaz de executar comandos através do cliente psql.

Como alguém poderia usar esse comando:

#+BEGIN_SRC sql :engine postgresql :ExtraParametersIfNeeded
SELECT * from pg_database
#+END_SRC

Em um host remoto? Conheço a opção: dir, mas até agora só consegui usá-la para scripts de shell.

Muito Obrigado!

KookieMonster
fonte
11
Você poderia fazer algum tunelamento SSH ... Você faria algo semelhante a " ssh yourbox -L7590:127.0.0.1:7590" substituir o " 7590" por qualquer porta em que seu banco de dados esteja. Em seguida, no bloco Org babel, você pode usar o :cmdlineargumento " " do cabeçalho para definir um argumento de linha de comando para definir a porta do banco de dados. A coisa toda pode ficar assim na parte superior do seu arquivo organizacional: " #+PROPERTY: header-args:sql :engine mysql :dbhost 127.0.0.1 :dbuser someone :dbpassword somepassword :database database :cmdline -P7590 ". Depois C-c C-cdisso, você pode usar qualquer bloco SQL no seu buffer assim.
Archenoth 27/07/2015
Olá, pensei nisso e também não consegui encontrar outra maneira. Se você responder, terei prazer em aceitá-lo.
KookieMonster 29/07/2015
Bem ... eu postei isso como um comentário porque, embora resolva o seu problema, ele realmente não responde à sua pergunta. Nada mudou no final do Emacs; você apenas criaria um túnel SSH manualmente para que o banco de dados possa ser acessado diretamente, em vez de fazer o Emacs controlar todo o processo por meio de um argumento de cabeçalho ou alguma configuração arbitrária - então, acho que não vou responder aquele. Talvez alguém conheça uma maneira de dizer ao Org-babel para criar esse túnel sem nenhum truque manual.
Archenoth 29/07

Respostas:

4

Não tenho certeza se ele está funcionando agora devido a atualizações no Emacs e tramp , mas como não há solução aceita e nenhum trecho de código exato para quem procura resposta, estou fornecendo um que esteja trabalhando no Emacs 25 e recente org-mode e vagabundo .

Como você já propôs na sua pergunta, :diré a solução, basta pegar a seção src e adicionar a mesma string usada para abrir arquivos na :dirdocumentação. Não há necessidade de fazer o túnel SSH, pois isso é algo que o vagabundo pode fazer imediatamente .

#+BEGIN_SRC sql :engine postgresql :dir /sshx:user@remotehost|sudo:postgres@remotehost:
SELECT * FROM pg_database
#+END_SRC

Trabalhando basta encontrar e retornar:

#+RESULTS:
| datname             | datdba | encoding | datcollate  | datctype    | datistemplate | datallowconn | datconnlimit | datlastsysoid | datfrozenxid | datminmxid | dattablespace | datacl                              |
|---------------------+--------+----------+-------------+-------------+---------------+--------------+--------------+---------------+--------------+------------+---------------+-------------------------------------|
| postgres            |     10 |        6 | C.UTF-8     | C.UTF-8     | f             | t            |           -1 |         12408 |          545 |          1 |          1663 |                                     |
| template0           |     10 |        6 | C.UTF-8     | C.UTF-8     | t             | f            |           -1 |         12408 |          545 |          1 |          1663 | {=c/postgres,postgres=CTc/postgres} |
Kepi
fonte
11
Confirmando que isso também funciona para o emacs 26 (.1), org 9.1.9, tramp 2.3.3.26.1
Andrea Reina
2

Como não sou um usuário organizacional, posso responder apenas do ponto de vista do Tramp. As configurações do Tramp que você mostrou acima não são necessárias ( add-to-listformulários), pois você está usando vários saltos ad-hoc em seu nome de arquivo. Então, suponho que um simples :dir "/sshx:user@remotehost|sudo:postgres@remotehost:/path/to/dir"deve fazer o trabalho.

Michael Albinus
fonte
Obrigado pelo seu comentário. Para executar scripts de shell (usando o comando: dir), tive que usar as linhas mencionadas acima, pois estava recebendo uma mensagem no estilo "sudo é permitido apenas no host local".
KookieMonster 27/07/2015
Você está certo, há um erro sutil no Tramp. Eu pude reproduzir o problema com o seguinte trecho de código: #+BEGIN_SRC sh :dir /ssh:remotehost|sudo:postgres@remotehost:/tmp whoami #+END_SRC Como solução alternativa, você pode fazer algo assim (não testado): #+BEGIN_SRC emacs-lisp (progn (require 'tramp) (add-to-list 'tramp-default-proxies-alist '(nil "\`root\\'" "/ssh:%h:"))) #+END_SRC #+BEGIN_SRC sh :dir /sudo:remotehost:/tmp whoami #+END_SRC
Michael Albinus