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

Luminus+H2+HugSQL+Clojure中:id参数查询报错求助

解决Luminus+H2+HugSQL中get-assessor查询无结果的问题

刚上手Luminus+H2+HugSQL这套Clojure开发组合,遇到这种“客户端能跑代码里不行”的问题太常见了!我帮你梳理几个最可能的原因和解决办法:

1. 先确认参数大小写与数据库列名的匹配问题

HugSQL对参数名的大小写是严格敏感的,而且H2数据库默认会把未加引号的表/列名转成大写!

  • 如果你Clojure代码里传的是:Id/:ID,而SQL里写的是:id,直接就会参数绑定失败,调用的时候一定要传{:id 你的ID值}
  • 要是你建表的时候id列实际是大写的ID(H2默认行为),那SQL里的条件得改成带引号的:
    -- :name get-assessor :? :1
    -- :doc retrieve a assessor given the id.
    SELECT * FROM assessores WHERE "ID" = :id
    
    或者干脆在H2连接URL里加;DATABASE_TO_LOWER=TRUE,强制让标识符保持小写。

2. 检查代码与SQL客户端的数据库连接是否一致

别小看这个!Luminus默认开发环境用的是内存H2库(URL类似jdbc:h2:mem:devDB;DB_CLOSE_DELAY=-1),而你SQL客户端可能连的是本地文件库。内存库重启应用就清空数据,自然查不到你之前在客户端插的内容。

  • 把resources/config.edn里的:database-url改成和客户端一致的文件路径,比如jdbc:h2:./devDB,再测试试试。

3. 验证save-assessor!是否真的成功插入数据

你说客户端插入正常,但代码里执行save-assessor!后查不到,有可能是插入根本没生效:

  • HugSQL的:n类型查询会返回受影响的行数,执行完打印一下返回值,如果是0说明插入失败,得检查save-assessor!的SQL是否正确,比如列名有没有写错
  • 另外,如果代码里用了事务但没提交(比如手动用jdbc/with-db-transaction却抛出了异常),数据会回滚,自然查不到。

4. 开启HugSQL调试日志看生成的SQL

直接看代码生成的SQL和参数是最直观的排查方式:

  • 在resources/logback.xml里添加HugSQL的DEBUG日志配置:
    <logger name="hugsql" level="DEBUG"/>
    
    然后看控制台输出,对比生成的SQL和你在客户端执行的有什么差异,比如参数有没有正确绑定,SQL语句有没有写错。

5. 确认id列的类型与插入逻辑

如果id是自增主键,那你插入的时候可能没获取到正确的生成ID:

  • 修改save-assessor!的SQL,让它返回生成的ID:
    -- :name save-assessor! :n
    -- :doc creates new assessor and returns generated id
    INSERT INTO assessores (name, email) VALUES (:name, :email)
    RETURNING id
    
  • 然后代码里用返回的ID去查询:
    (let [new-assessor-id (save-assessor! db {:name "John" :email "john@example.com"})]
      (get-assessor db {:id new-assessor-id}))
    

如果这些都试过还是没解决,把你的Clojure调用代码和save-assessor!的完整SQL贴出来,我再帮你细化排查~

内容的提问来源于stack exchange,提问作者Luis

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:52:35