gpt4 book ai didi

haskell - 在 Sqlite3 中输入的 Scotty 参数

转载 作者:行者123 更新时间:2023-12-03 19:43:08 27 4
gpt4 key购买 nike

我正在尝试创建一个网站,该网站将通过 URL 路由获取信息,然后将此信息传递到 HDBC SQLITE3数据库。我已经弄清楚如何使用 Scotty 通过参数获取信息以及如何使用 HDBC 创建数据库。但是我无法将参数信息传递给数据库。我收到此错误:(对于这样的初学者问题,我很抱歉,我只使用 Haskell 大约三周)

Controllers/Home.hs:51:48:
No instance for (Convertible a0 SqlValue)
arising from a use of `toSql'
Possible fix:
add an instance declaration for (Convertible a0 SqlValue)
In the expression: toSql
In the expression: toSql $ userId
In the third argument of `run', namely
`[toSql $ userId, toSql $ name]'

Controllers/Home.hs:51:64:
No instance for (Convertible a1 SqlValue)
arising from a use of `toSql'
Possible fix:
add an instance declaration for (Convertible a1 SqlValue)
In the expression: toSql
In the expression: toSql $ name
In the third argument of `run', namely
`[toSql $ userId, toSql $ name]'

这是我要运行的代码:
import Control.Monad
import Web.Scotty (ScottyM, ActionM, get, html, param)
import Data.Monoid (mconcat)
import Database.HDBC
import Database.HDBC.Sqlite3
import Control.Monad.Trans ( MonadIO(liftIO) )
import Data.Convertible
createUser :: ScottyM()
createUser = get "/create/user/:userId/:name" $ do
name <- param "name"
userId <- param "userId"
liftIO $ createUserDB name userId
html $ mconcat ["<p>/create/user/" , userId , "/" , name ,"</p>"]
createUserDB :: a1 -> a0 -> IO()
createUserDB name userId = do
conn <- connectSqlite3 databaseFilePath
run conn "INSERT INTO users VALUES (? , ?)" [toSql $ userId, toSql $ name]
commit conn
disconnect conn
databaseFilePath = "data/mydb.db"

如果有人可以提供如何解决这个问题,以及 为什么他们的修复有效那真的很有帮助!

最佳答案

我认为编译器在提示,因为代码要求 createUserDB 的参数满足错误消息中的约束(即它们可转换为 Sqlvalue ),但您给出的签名不提供该保证( a0a1 可以是任何类型)。

最简单的选择是删除 createUserDB 的类型签名。并让编译器推断它。或者,您可以将其限制为 Text值(因为 nameuserId 的类型为 Text Database.HDBC.SqlValue 定义了 Convertible Text SqlValue 的实例):

createUserDB :: Text -> Text -> IO ()

通常,您还可以在函数签名中使用上下文来限制类型:
createUserDB :: (Convertible a0 SqlValue, Convertible a1 SqlValue) => a1 -> a0 -> IO ()

但这可能不是一个好主意,因为类型显然是 SQL 字符串并且可能映射到 varchars。

关于haskell - 在 Sqlite3 中输入的 Scotty 参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26308623/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com