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里的条件得改成带引号的:
或者干脆在H2连接URL里加-- :name get-assessor :? :1 -- :doc retrieve a assessor given the id. SELECT * FROM assessores WHERE "ID" = :id;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日志配置:
然后看控制台输出,对比生成的SQL和你在客户端执行的有什么差异,比如参数有没有正确绑定,SQL语句有没有写错。<logger name="hugsql" level="DEBUG"/>
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
相关产品推荐
相关产品推荐

