This code gives me an error:
67: isFileInstalled f = do
68: dbcon <- open "/var/lib/beaver/pkgs.db"
69: res <- queryNamed dbcon "SELECT * FROM files WHERE path = :path" [":path" := ("/usr/bin/getpkg" :: String)]
70: mapM_ putStrLn res
71: -- when (null res) (return ())
72: -- putStrLn ("File " ++ res ++ " is already installed and comes from " ++ res ++ ".") -- first res is `owner` and second is `path`
73: close dbcon
74: exit
I get this error:
No instance for (Database.SQLite.Simple.FromField.FromField Char)
arising from a use of `queryNamed' In a stmt of a 'do' block:
res <- queryNamed
dbcon
"SELECT * FROM files WHERE path = :path"
[":path" := ("/usr/bin/getpkg" :: String)] In the expression:
do { dbcon <- open "/var/lib/beaver/pkgs.db";
res <- queryNamed
dbcon
"SELECT * FROM files WHERE path = :path"
[":path" := ("/usr/bin/getpkg" :: String)];
mapM_ putStrLn res;
close dbcon;
.... } In an equation for `isFileInstalled':
isFileInstalled f
= do { dbcon <- open "/var/lib/beaver/pkgs.db";
res <- queryNamed
dbcon
"SELECT * FROM files WHERE path = :path"
[":path" := ("/usr/bin/getpkg" :: String)];
mapM_ putStrLn res;
I didn't find anything in Google. If it's important, OverloadedStrings are enabled. Is there workaround (or way to fix it)?
You are using res as a [String]:
mapM_ putStrLn res
It is equivalent to [[Char]]. But queryNamed returns a list of rows, so each row has type [Char]. There is an instance FromField a => FromRow [a], but there is no instance FromField Char. That is what the error messages says.
I never used sqlite-simple, but it is clear that each row contains a number of fields, so you are trying to fetch a row that contains a number of fields of type Char. That makes no sense. Depending on actual database scheme, each row should be e.g. a number of text field, then the res can have type [[String]]. In that case you should use it like the next:
mapM_ (mapM_ putStrLn) (res :: [[String]])
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With