我正在尝试从 SQLite 数据库加载数据,但我不知道数据格式,因为它是用户提供的。
如果所有列都属于同一类型,则此方法有效:
(entries :: [[Text]]) <- query_ connection "select * from users"
但是,如果列有不同的类型(例如 INTEGER 或 REAL),我该怎么办?
我正在尝试从 SQLite 数据库加载数据,但我不知道数据格式,因为它是用户提供的。
如果所有列都属于同一类型,则此方法有效:
(entries :: [[Text]]) <- query_ connection "select * from users"
但是,如果列有不同的类型(例如 INTEGER 或 REAL),我该怎么办?
TLDR:使用entries :: [[SQLData]]
您似乎正在使用sqlite-simple。在那个包中,类型query_
是
query_ :: FromRow r => Connection -> Query -> IO [r]
query_
使用FromRow
and (间接)FromField
类型类。这些助手将传入的 sqlite 行和列数据转换为用户期望的格式。
但是,当源和输出类型不可转换时,这些转换可能会失败。
表示“SQLData
原始”未转换的 sqlite 数据类型。将列值转换SQLData
为无操作并且永远不会失败。并且使用[SQLData]
for the rows 也永远不会失败,因为列表可以处理任意数量的列(与(SQLData,SQLData)
元组不同)。
因此,在处理未知模式时,我们可以将[SQLData]
其用作行类型,然后对SQLData
值进行模式匹配以发现实际的 sqlite 类型。