You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 14:45:09