mysql-haskell 没有调用 try 函数的正确情况

问题描述 投票:0回答:1

我正在编写带有servant和mysql-haskell包的简单服务器,我在其中调用一些插入查询,这部分代码:

...
    result <- try $ M.query conn ("insert into `user` (`email`,`name`,`date_joined`) values (?, ?, NOW());") [M.One $ M.MySQLText "[email protected]", M.One $ M.MySQLText "username"]
    
    case result of
          Right (defs,is) -> do 
                        putStrLn "No exception occurred"
                        print =<< Streams.toList is 
          Left e  -> putStrLn ("Caught exception: " ++ show (e :: M.ERRException))
...

问题是,如果我发送插入新用户的请求,我会看到它插入到数据库中,但没有调用正确的早午餐 - 我在控制台中没有看到“没有发生异常”,并且我的客户端没有收到响应(只是挂起),但正如我所说,服务器提供了对数据库的真正插入(我看到创建了新行),因此它看起来像是卡在 M.query 或 try 函数中,而不调用 Rigth brunch..

有趣的是,在具有重复请求的第二个查询中,它调用“左”分支,我明白了

"Caught exception: ERRException (ERR {errCode = 1062, errState = "23000", errMsg = "Duplicate entry '[email protected]' for key 'uniq_site_email'"})
"

客户没有挂起就得到了响应。

我有:

GHCi, version 9.4.8
mysql  Ver 8.0.36 for Linux on x86_64

为什么会发生这种情况以及如何解决?

mysql haskell servant
1个回答
0
投票

发现问题:需要使用M.execute vs M.query

result <- try $ M.execute conn ("insert into `user` (`email`,`name`,`date_joined`) values (?, ?, NOW());") [M.One $ M.MySQLText "[email protected]", M.One $ M.MySQLText "username"]

对于这种情况,在 lib 中添加一些错误会很好。

© www.soinside.com 2019 - 2024. All rights reserved.