Saya memiliki masalah yang sama dan memutuskan untuk membuat backend saya sendiri. Salah satu backend yang ada (C ++?) Digunakan sebagai templat dan saya memodifikasinya untuk membuat back end baru yang berperilaku seperti kamus.
Dalam pengaturan saya, buffer SQLi secara otomatis dinamai sesuai dengan database yang sedang terhubung, misalnya. *DB:DBASE1DM*
. Backend berisi daftar untuk setiap database dengan skema, tabel, dan kolom. Ketika saya ingin menyelesaikan sesuatu, nama buffer digunakan untuk mendapatkan daftar kandidat yang tepat untuk database itu.
(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)))
Ini memiliki kelemahan bahwa itu bukan penyelesaian yang cerdas dan termasuk database baru atau membuat modifikasi ke database yang ada adalah proses manual. Beberapa pertanyaan dapat digunakan untuk mengumpulkan data dan kemudian tidak terlalu sulit untuk memijatnya ke dalam format yang diperlukan untuk backend.
Fungsi di bawah ini menangani koneksi ke database dan mengubah nama buffer agar sesuai dengan database yang terhubung.
(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 "*"))))