Eu tive um problema semelhante e decidi criar meu próprio back-end. Um dos back-ends existentes (C ++?) Foi usado como modelo e eu o modifiquei para criar o novo back-end que se comporta como um dicionário.
Na minha configuração, os buffers do SQLi são nomeados automaticamente para corresponder ao banco de dados ao qual está sendo conectado, por exemplo. *DB:DBASE1DM*
. O back-end contém uma lista para cada banco de dados com os esquemas, tabelas e colunas. Quando eu quero concluir algo, o nome do buffer é usado para obter a lista correta de candidatos para esse banco de dados.
(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)))
Isso tem a desvantagem de não ser uma conclusão inteligente e que incluir novos bancos de dados ou fazer modificações nos bancos de dados existentes é um processo manual. Algumas consultas podem ser usadas para coletar os dados e, em seguida, não é muito difícil utilizá-los no formato necessário para o back-end.
A função abaixo trata da conexão com um banco de dados e da alteração dos nomes dos buffers para corresponder ao banco de dados ao qual está conectado.
(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 "*"))))