Haskell HDBC.Sqlite3 fetchAllRows
Haskell HDBC.Sqlite3 fetchAllRows
由于我是一个绝对的Haskell初学者,但决心要征服它,所以我再次寻求帮助。
使用:
fetchData2 = do
conn <- connectSqlite3 "dBase.db"
statement <- prepare conn "SELECT * FROM test WHERE id > 0"
execute statement []
results <- fetchAllRows statement
print results
returns:
[[SqlInt64 3,SqlByteString "Newco"],[SqlInt64 4,SqlByteString "Oldco"],[SqlInt64 5,SqlByteString "Mycom"],[SqlInt64 4,SqlByteString "Oldco"],[SqlInt64 5,SqlByteString "Mycom"]]
有没有一种聪明的方法可以将这些数据清理成 Int
和 [Char]
,换句话说,省略类型 SqlInt64
和 SqlByteString
。
您可以定义一个助手:
fetchRowFromSql :: Convertible SqlValue a => Statement -> IO (Maybe [a])
fetchRowFromSql = fmap (fmap (fmap fromSql)) . fetchRow
实施看起来有点令人生畏,但这只是因为我们需要深入了解分层函子,正如您已经指出的那样(首先是 IO
,然后是 Maybe
,最后是 []
).这个 returns 可以从 SqlValue
转换而来的东西。已经定义了很多这些。参见例如the docs。一个例子(使用 -XTypeApplications
):
fetchRowFromSql @String :: Statement -> IO (Maybe [String])
我或许应该补充一点,文档中提到 fromSql
是不安全的。这意味着如果您尝试将 sql 值转换为不兼容的 Haskell 值,程序将停止。
由于我是一个绝对的Haskell初学者,但决心要征服它,所以我再次寻求帮助。
使用:
fetchData2 = do
conn <- connectSqlite3 "dBase.db"
statement <- prepare conn "SELECT * FROM test WHERE id > 0"
execute statement []
results <- fetchAllRows statement
print results
returns:
[[SqlInt64 3,SqlByteString "Newco"],[SqlInt64 4,SqlByteString "Oldco"],[SqlInt64 5,SqlByteString "Mycom"],[SqlInt64 4,SqlByteString "Oldco"],[SqlInt64 5,SqlByteString "Mycom"]]
有没有一种聪明的方法可以将这些数据清理成 Int
和 [Char]
,换句话说,省略类型 SqlInt64
和 SqlByteString
。
您可以定义一个助手:
fetchRowFromSql :: Convertible SqlValue a => Statement -> IO (Maybe [a])
fetchRowFromSql = fmap (fmap (fmap fromSql)) . fetchRow
实施看起来有点令人生畏,但这只是因为我们需要深入了解分层函子,正如您已经指出的那样(首先是 IO
,然后是 Maybe
,最后是 []
).这个 returns 可以从 SqlValue
转换而来的东西。已经定义了很多这些。参见例如the docs。一个例子(使用 -XTypeApplications
):
fetchRowFromSql @String :: Statement -> IO (Maybe [String])
我或许应该补充一点,文档中提到 fromSql
是不安全的。这意味着如果您尝试将 sql 值转换为不兼容的 Haskell 值,程序将停止。