org-babel y comandos sql remotos

8

Estoy usando org-babel para hacer programación literaria y me parece muy conveniente. Puedo ejecutar comandos de shell en hosts remotos y comandos de bases de datos locales con el cliente postgres. Para abrir un archivo como usuario de postgres, se vería, por ejemplo, como

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

Para hacerlo en Emacs 24.5.1, necesitaba agregar:

(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))

Hasta ahora, no he podido entender cómo se podría ejecutar un comando postgresql (o mysql si así lo desea) en un servidor remoto. No se puede acceder al servidor de la base de datos directamente a través de la red, tengo que ingresar ssh en el host remoto, su como usuario de postgres y luego puedo ejecutar comandos a través del cliente psql.

¿Cómo podría uno usar tal comando?

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

En un host remoto? Conozco el interruptor: dir, pero hasta ahora solo he podido usarlo para scripts de shell.

¡Muchas gracias!

KookieMonster
fuente
1
Podrías hacer algunos túneles SSH ... Harías algo similar a " ssh yourbox -L7590:127.0.0.1:7590" reemplazar el " 7590" con cualquier puerto en el que esté tu base de datos. Luego, en su bloque Org babel, puede usar el " :cmdline" argumento de encabezado para establecer un argumento de línea de comando para establecer el puerto de la base de datos. Todo esto podría verse más o menos así en la parte superior de su archivo Org: " #+PROPERTY: header-args:sql :engine mysql :dbhost 127.0.0.1 :dbuser someone :dbpassword somepassword :database database :cmdline -P7590 ". Después de C-c C-ceso, puede usar cualquier bloque SQL en su búfer así.
Archenoth
Hola, lo pensé y no pude encontrar otra manera yo también. Si le respondes, con gusto lo aceptaré.
KookieMonster
Bueno ... publiqué eso como un comentario porque, aunque resuelve tu problema, en realidad no responde a tu pregunta. Nada ha cambiado en el extremo de Emacs; simplemente crearía un túnel SSH manualmente para que se pueda acceder a la base de datos directamente en lugar de hacer que Emacs controle todo el proceso a través de un argumento de encabezado o alguna configuración arbitraria, por lo que no creo que responda ese. Tal vez alguien más conozca una manera de decirle a Org-babel que cree este túnel sin ninguna falsificación manual.
Archenoth

Respuestas:

4

No estoy seguro de si está funcionando ahora debido a las actualizaciones en Emacs y vagabundo , pero como no hay una solución aceptada ni un fragmento exacto de código para aquellos que buscan una respuesta, les estoy proporcionando una que funciona en Emacs 25 y reciente org-mode y vagabundo .

Como ya propuso en su pregunta, esta :dires la solución, simplemente tome su sección src y agregue la misma cadena que usó para abrir archivos a la :dirresolución. No hay necesidad de hacer un túnel SSH, ya que esto es algo que el vagabundo puede hacer de inmediato.

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

Trabajando solo encuentra y devuelve:

#+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} |
Quepis
fuente
1
Confirmando que esto también funciona para emacs 26 (.1), org 9.1.9, vagabundo 2.3.3.26.1
Andrea Reina
2

No soy un usuario de la organización, por lo que solo puedo responder desde el punto de vista de Tramp. La configuración de Vagabundo que ha mostrado anteriormente no es necesaria ( add-to-listformularios), ya que está utilizando saltos múltiples ad-hoc en su nombre de archivo. Así que supongo que un simple :dir "/sshx:user@remotehost|sudo:postgres@remotehost:/path/to/dir"debería hacer el trabajo.

Michael Albinus
fuente
Gracias por tu comentario. Para ejecutar scripts de shell (usando el comando: dir) tuve que usar las líneas mencionadas anteriormente, ya que recibía un mensaje en el estilo de "sudo solo está permitido en el host local".
KookieMonster
Tienes razón, hay un error sutil en Tramp. Podría reproducir el problema con el siguiente fragmento de código: #+BEGIN_SRC sh :dir /ssh:remotehost|sudo:postgres@remotehost:/tmp whoami #+END_SRC Como solución alternativa, podría hacer algo como esto (no probado): #+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