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!


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} |

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.


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.