org-babel und remote sql befehle

8

Ich benutze org-babel, um Wurfprogrammierung zu machen, und ich finde es sehr praktisch. Ich kann Shell-Befehle auf Remote-Hosts und lokale Datenbankbefehle mit dem Postgres-Client ausführen. Um eine Datei als Postgres-Benutzer zu öffnen, würde sie beispielsweise so aussehen

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

Um dies auf Emacs 24.5.1 zu tun, musste ich hinzufügen:

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

Bisher habe ich nicht verstanden, wie man einen postgresql-Befehl (oder mysql, wenn Sie dies wünschen) auf einem Remote-Server ausführen kann. Auf den Datenbankserver kann nicht direkt über das Netzwerk zugegriffen werden. Ich muss ssh in den Remote-Host, su als Postgres-Benutzer, und dann kann ich Befehle über den psql-Client ausführen.

Wie könnte man einen solchen Befehl verwenden:

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

Auf einem Remote-Host? Ich kenne den Schalter: dir, konnte ihn aber bisher nur für Shell-Skripte verwenden.

Danke vielmals!

KookieMonster
quelle
1
Sie könnten SSH-Tunneling durchführen ... Sie würden etwas tun, das dem " ssh yourbox -L7590:127.0.0.1:7590" Ersetzen des " 7590" durch einen beliebigen Port Ihrer Datenbank ähnelt. Anschließend können Sie in Ihrem Org-Babel-Block das :cmdlineHeader-Argument " " verwenden, um ein Befehlszeilenargument zum Festlegen des Datenbankports festzulegen. Das Ganze könnte oben in Ihrer Org-Datei ungefähr so ​​aussehen: " #+PROPERTY: header-args:sql :engine mysql :dbhost 127.0.0.1 :dbuser someone :dbpassword somepassword :database database :cmdline -P7590 ". Danach C-c C-ckönnen Sie einen beliebigen SQL-Block in Ihrem Puffer verwenden.
Archenoth
Hallo, ich habe darüber nachgedacht und konnte auch selbst keinen anderen Weg finden. Wenn Sie eine Antwort geben, akzeptiere ich sie gerne.
KookieMonster
Nun ... Ich habe das als Kommentar gepostet, weil es zwar Ihr Problem löst, aber Ihre Frage nicht wirklich beantwortet. Am Emacs-Ende hat sich nichts geändert. Sie würden nur manuell einen SSH-Tunnel erstellen, damit direkt auf die Datenbank zugegriffen werden kann , anstatt Emacs den gesamten Prozess über ein Header-Argument oder eine beliebige Konfiguration steuern zu lassen. Ich glaube also nicht, dass ich eine Antwort darauf geben werde Das. Vielleicht kennt jemand anderes eine Möglichkeit, Org-babel anzuweisen, diesen Tunnel ohne manuelles Fudgen zu erstellen.
Archenoth

Antworten:

4

Ich bin mir nicht sicher, ob es jetzt aufgrund von Updates in Emacs und Tramp funktioniert , aber da es keine akzeptierte Lösung und keinen genauen Codeausschnitt für diejenigen gibt, die nach Antworten suchen, biete ich eine an, die in Emacs 25 funktioniert und neuer org-mode und tramp .

Wie Sie bereits in Ihrer Frage vorgeschlagen haben, :dirist die Lösung. Nehmen Sie einfach Ihren src- Abschnitt und fügen Sie dieselbe Zeichenfolge hinzu, die Sie zum Öffnen von Dateien für das :dirArugment verwendet haben. Es ist nicht erforderlich, einen SSH-Tunnel zu erstellen, da Tramp dies sofort tun kann.

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

Arbeiten nur finden und zurück:

#+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} |
Käppi
quelle
1
Bestätigung, dass dies auch für Emacs 26 (.1) funktioniert, org 9.1.9, Tramp 2.3.3.26.1
Andrea Reina
2

Ich bin kein Organisationsbenutzer, daher kann ich nur aus der Sicht von Tramp antworten. Die oben gezeigten Tramp-Einstellungen werden nicht benötigt ( add-to-listFormulare), da Sie in Ihrem Dateinamen Ad-hoc-Multi-Hops verwenden. Also ich :dir "/sshx:user@remotehost|sudo:postgres@remotehost:/path/to/dir"gehe davon aus, dass ein einfacher den Job machen sollte.

Michael Albinus
quelle
Danke für deinen Kommentar. Um Shell-Skripte auszuführen (mit dem Befehl: dir), musste ich die oben genannten Zeilen verwenden, da ich eine Nachricht im Stil "sudo ist nur auf lokalem Host zulässig" erhielt.
KookieMonster
Du hast recht, es gibt einen subtilen Fehler in Tramp. Ich könnte das Problem mit dem folgenden Code-Snippet reproduzieren: #+BEGIN_SRC sh :dir /ssh:remotehost|sudo:postgres@remotehost:/tmp whoami #+END_SRC Als Problemumgehung könnten Sie so etwas tun (ungetestet): #+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