如何在Emacs中使用sql-password-wallet配合sql-postgres连接数据库
正确配置sql-password-wallet读取GPG加密凭证的方法
1. 基础配置确认
在init.el中明确指定auth-source的加密钱包路径,并让sql库使用auth-source作为密码源:
;; 指定GPG加密的钱包文件路径,替换成你的实际路径 (setq auth-sources '((:source "~/sql-wallet.gpg"))) ;; 告诉sql库通过auth-source获取密码 (setq sql-password-wallet 'auth-source)
2. 钱包文件格式要求
GPG加密的钱包文件必须符合auth-source的规范,每条凭证单独一行,格式如下:
machine <数据库主机> port <端口> dbname <数据库名> user <用户名> password <密码>
示例条目:
machine localhost port 5432 dbname my_project user dev_user password my_secure_pass
保存后用GPG加密为.gpg后缀的文件。
3. sql-connection-alist正确配置
不要在连接列表中硬编码密码,让sql库自动匹配凭证,示例配置:
(setq sql-connection-alist '((my-dev-db (sql-product 'postgres) (sql-server "localhost") (sql-port 5432) (sql-user "dev_user") (sql-database "my_project"))))
4. 强制绑定密码获取逻辑
如果默认逻辑不生效,自定义密码获取函数覆盖默认行为:
(defun my-sql-fetch-password (connection) "从auth-source匹配CONNECTION对应的数据库密码" (let* ((user (plist-get connection :sql-user)) (server (plist-get connection :sql-server)) (port (plist-get connection :sql-port)) (dbname (plist-get connection :sql-database)) (auth-entry (auth-source-search :max 1 :host server :port port :user user :database dbname))) (if auth-entry (funcall (plist-get (car auth-entry) :secret)) (error "未找到对应数据库的加密凭证")))) (setq sql-get-password #'my-sql-fetch-password)
5. 调试排查
开启auth-source调试模式,查看凭证读取日志:
(setq auth-source-debug t)
调用sql-connect后,查看*Messages*缓冲区的调试信息,确认是否加载了目标GPG钱包、是否匹配到对应条目。若未加载,检查auth-sources路径是否正确,或手动打开钱包文件确认GPG解密流程正常。
内容的提问来源于stack exchange,提问作者Doug
相关产品推荐
相关产品推荐

