Tôi đã có một vấn đề tương tự và quyết định tạo phụ trợ của riêng tôi. Một trong những phụ trợ hiện có (C ++?) Đã được sử dụng làm mẫu và tôi đã sửa đổi nó để tạo phần cuối mới hoạt động giống như một từ điển.
Trong thiết lập của tôi, bộ đệm SQLi được tự động đặt tên để khớp với cơ sở dữ liệu đang được kết nối, vd. *DB:DBASE1DM*
. Phần cuối chứa một bản sao cho mỗi cơ sở dữ liệu với các lược đồ, bảng và cột. Khi tôi muốn hoàn thành một cái gì đó, tên của bộ đệm được sử dụng để có được danh sách chính xác các ứng cử viên cho cơ sở dữ liệu đó.
(defun ry/company-sql-upper-lower (&rest lst)
(nconc (sort (mapcar 'upcase lst) 'string<) lst))
(defvar ry/company-sql-alist
`(("DBASE1" ;; Database name w/o environment suffix.
"DBASE1DM" "DBASE1UM" ;; Database name with environment suffix.
"SCHEMA1" "SCHEMA2"
"TABLE1" "TABLE2"
"COLUMN1" "COLUMN2")
("DBASE2"
"DBASE2DM" "DBASE2UM"
"SCHEMA1" "SCHEMA2"
"TABLE1" "TABLE2"
"COLUMN1" "COLUMN2"))
"Alist mapping sql-mode to candidates.")
(defun ry/company-sql (command &optional arg &rest ignored)
"`company-mode' back-end for SQL mode based on database name."
(interactive (list 'interactive))
(cl-case command
(interactive (company-begin-backend 'ry/company-sql))
(prefix (and (assoc (substring (buffer-name (current-buffer)) 4 -3) ry/company-sql-alist)
(not (company-in-string-or-comment))
(or (company-grab-symbol) 'stop)))
(candidates
(let ((completion-ignore-case t)
(symbols (cdr (assoc (substring (buffer-name (current-buffer)) 4 -3) ry/company-sql-alist))))
(all-completions arg (if (consp symbols)
symbols
(cdr (assoc symbols company-sql-alist))))))
(sorted t)))
Điều này có nhược điểm là nó không phải là một sự hoàn thành thông minh và bao gồm các cơ sở dữ liệu mới hoặc sửa đổi các cơ sở dữ liệu hiện tại là một quy trình thủ công. Một vài truy vấn có thể được sử dụng để thu thập dữ liệu và sau đó không khó để đưa dữ liệu vào định dạng cần thiết cho phụ trợ.
Hàm bên dưới xử lý kết nối với cơ sở dữ liệu và thay đổi tên của bộ đệm để khớp với cơ sở dữ liệu được kết nối.
(defun ry/sql-open-database (database username password)
"Open a SQLI process and name the SQL statement window with the name provided."
(interactive (list
(read-string "Database: ")
(read-string "Username: ")
(read-passwd "Password: ")))
(let ((u-dbname (upcase database)))
(setq sql-set-product "db2")
(sql-db2 u-dbname)
(sql-rename-buffer u-dbname)
(setq sql-buffer (current-buffer))
(sql-send-string (concat "CONNECT TO " database " USER " username " USING " password ";"))
(other-window 1)
(switch-to-buffer (concat "*DB:" u-dbname "*"))
(sql-mode)
(sql-set-product "db2")
(setq sql-buffer (concat "*SQL: " u-dbname "*"))))