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!
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:cmdline
Header-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
". DanachC-c C-c
können Sie einen beliebigen SQL-Block in Ihrem Puffer verwenden.Antworten:
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,
:dir
ist 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:dir
Arugment verwendet haben. Es ist nicht erforderlich, einen SSH-Tunnel zu erstellen, da Tramp dies sofort tun kann.Arbeiten nur finden und zurück:
quelle
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-list
Formulare), 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.quelle
#+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