sql - 在 Groundhog Haskell 中通过投影键选择行的理想方法是什么

标签 sql database haskell

我正在尝试使用 Haskell 中的 Groundhog 创建多对多表,如果我去掉所有其他逻辑,它基本上看起来像这样:

data FooRow = FooRow {
  fooRowUUID :: UUID
}
deriving instance Show FooRow

data BarRow = BarRow {
  barRowUUID :: UUID
}
deriving instance Show BarRow

data FooToBarRow = FooToBarRow {
  fooToBarRowUUID :: UUID,
  fooToBarRowFoo :: DefaultKey FooRow,
  fooToBarRowBar :: DefaultKey BarRow
}
deriving instance Show FooToBarRow

现在,尝试定义操作,我可以很好地获取和插入所有这些记录,但是我不确定如何从拥有 FooRow 及其 ID,然后通过以下方式获取所有相关的 BarRows多对多表。现在我玩过这样的东西:

getBarsForFoo fooID = do
  barKeys <- project 
    (FooToBarRowBarField)
    (FooToBarRowFooField ==. (Foo_FooKey fooID))
  select $ (BarRowUUIDField `in_` barKeys)

然而,这并没有进行类型检查,并出现错误:

Couldn't match type 'UUID' with 'BarRow'

仅使用 putStrLn 检查项目的结果,我可以看到 barKeys 的类型是:

[Bar_BarKey UUID]

但我不太明白如何在我的查询中使用它。我在 Groundhog 文档中没有看到任何这样的例子,所以我希望有人能够在这里让我走上正确的道路。

最佳答案

我很确定有更有效的方法来解决这个问题(这种方法会产生大量的底层查询),但这至少暂时完成了工作。

getBarsForFoo fooID = do
    barKeys <- project 
        (FooToBarRowBarField)
        (FooToBarRowFooField ==. (Foo_FooKey fooID))
    q <- mapM (getBy) barKeys
    return (catMaybes q :: [BarRow])

关于sql - 在 Groundhog Haskell 中通过投影键选择行的理想方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28355709/

相关文章:

sql - MS SQL服务器: Check to see if a user can execute a stored procedure

asp.net - 使用 ASP.net 在 MySql 中存储当前日期和时间

mysql - 如何将现有数据库导入到我的 db.py 模型中?

sql - excel导入sql时数据转换错误

mysql - 帮助理解一条 SQL 语句

sql - 使用 get_results() 执行时查询返回不同的结果

sql - 存储可变数量首选项的最佳方式?

haskell - 将 Scheme call/cc 翻译成 Haskell callCC

haskell - 在变压器堆栈的底部插入 ErrorT

haskell - 函数式语言的显着特征