lệnh org-babel và sql từ xa


8

Tôi đang sử dụng org-babel để lập trình xả rác và tôi thấy nó rất thuận tiện. Tôi có thể thực thi các lệnh shell trên các máy chủ từ xa và các lệnh cơ sở dữ liệu cục bộ với máy khách postgres. Để mở một tệp như người dùng postgres, nó sẽ tìm ví dụ như

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

Để làm như vậy trên Emacs 24.5.1, tôi cần thêm:

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

Cho đến nay, tôi đã không hiểu làm thế nào người ta có thể thực thi lệnh postgresql (hoặc mysql nếu bạn chọn) trên một máy chủ từ xa. Máy chủ cơ sở dữ liệu không thể truy cập trực tiếp qua mạng, tôi phải ssh vào máy chủ từ xa, với tư cách là người dùng postgres và sau đó tôi có thể thực thi các lệnh thông qua máy khách psql.

Làm thế nào người ta có thể sử dụng một lệnh như vậy:

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

Trên một máy chủ từ xa? Tôi biết: chuyển đổi dir, nhưng cho đến nay chỉ có thể sử dụng nó cho shell script.

Cảm ơn nhiều!


1
Bạn có thể thực hiện một số đường hầm SSH ... Bạn sẽ làm một cái gì đó giống như " ssh yourbox -L7590:127.0.0.1:7590" thay thế " 7590" bằng bất kỳ cổng nào mà cơ sở dữ liệu của bạn được bật. Sau đó, trong khối babg Org của bạn, bạn có thể sử dụng :cmdlineđối số tiêu đề "" để đặt đối số dòng lệnh để đặt cổng cơ sở dữ liệu. Toàn bộ mọi thứ có thể trông giống như thế này ở đầu tệp Org của bạn: " #+PROPERTY: header-args:sql :engine mysql :dbhost 127.0.0.1 :dbuser someone :dbpassword somepassword :database database :cmdline -P7590 ". Sau C-c C-cđó, bạn có thể sử dụng bất kỳ khối SQL nào trong bộ đệm của mình như thế.
Archenoth

Xin chào, tôi đã nghĩ về nó và tôi cũng không thể tìm thấy bất kỳ cách nào khác. Nếu bạn làm cho nó một câu trả lời, tôi sẽ vui lòng chấp nhận nó.
KookieMonster 29/07/2015

Chà ... tôi đã đăng nó như một bình luận bởi vì, trong khi nó giải quyết vấn đề của bạn, nó không thực sự trả lời câu hỏi của bạn. Không có gì thay đổi ở phần cuối của Emacs; bạn sẽ chỉ tạo một đường hầm SSH theo cách thủ công để cơ sở dữ liệu có thể được truy cập trực tiếp chứ không phải làm cho Emacs kiểm soát toàn bộ quá trình thông qua một đối số tiêu đề hoặc một số cấu hình tùy ý - vì vậy, tôi không nghĩ rằng mình sẽ trả lời cái đó. Có lẽ ai đó khác biết cách để nói với Org-babel tạo ra đường hầm này mà không có bất kỳ lỗi nào.
Archenoth 29/07/2015

Câu trả lời:


4

Tôi không chắc bây giờ nó có hoạt động hay không vì các bản cập nhật trong Emacstramp , nhưng vì không có giải pháp được chấp nhận và không có đoạn mã chính xác cho những ai đang tìm kiếm câu trả lời, tôi đang cung cấp một bản đang hoạt động trong Emacs 25chế độ orgtramp gần đây .

Như bạn đã đề xuất trong câu hỏi của mình, :dirlà giải pháp, chỉ cần lấy phần src của bạn và thêm cùng một chuỗi như bạn đã sử dụng để mở tệp vào :dirarugment. Không cần phải thực hiện SSH đường hầm vì đây là điều mà tramp có thể làm được.

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

Làm việc chỉ cần tìm và trả lại:

#+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
Xác nhận rằng điều này cũng hoạt động cho emacs 26 (.1), org 9.1.9, tramp 2.3.3.26.1
Andrea Reina

2

Tôi không phải là người dùng org, vì vậy tôi chỉ có thể trả lời theo quan điểm của Tramp. Cài đặt Tramp mà bạn đã trình bày ở trên là không cần thiết ( add-to-listbiểu mẫu), vì bạn đang sử dụng nhiều bước nhảy đặc biệt trong tên tệp của mình. Vì vậy, tôi giả sử đơn giản :dir "/sshx:user@remotehost|sudo:postgres@remotehost:/path/to/dir"nên làm công việc.


Cảm ơn bạn đã bình luận. Để thực thi các tập lệnh shell (sử dụng lệnh: dir), tôi đã phải sử dụng các dòng được đề cập ở trên, vì tôi nhận được một tin nhắn theo kiểu "sudo chỉ được phép trên máy chủ cục bộ".
KookieMonster

Bạn nói đúng, có một lỗi tinh vi trong Tramp. Tôi có thể tái tạo vấn đề với đoạn mã sau: #+BEGIN_SRC sh :dir /ssh:remotehost|sudo:postgres@remotehost:/tmp whoami #+END_SRC Như cách giải quyết, bạn có thể làm một cái gì đó như thế này (chưa được kiểm tra): #+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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.