Tuve un problema similar y decidí crear mi propio backend. Uno de los backends existentes (C ++?) Se usó como plantilla y lo modifiqué para crear el nuevo back-end que se comporta como un diccionario.
En mi configuración, los buffers SQLi se nombran automáticamente para que coincidan con la base de datos a la que se está conectando, por ejemplo. *DB:DBASE1DM*
. El backend contiene una lista para cada base de datos con esquemas, tablas y columnas. Cuando quiero completar algo, el nombre del búfer se usa para obtener la lista correcta de candidatos para esa base de datos.
(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)))
Esto tiene el inconveniente de que no es una finalización inteligente y que incluir nuevas bases de datos o realizar modificaciones en las bases de datos existentes es un proceso manual. Se pueden usar un par de consultas para recopilar los datos y luego no es muy difícil darles masajes en el formato necesario para el backend.
La siguiente función maneja la conexión a una base de datos y el cambio de los nombres de los buffers para que coincidan con la base de datos que está conectada.
(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 "*"))))