database - haskell "persistent"模型 : How to correctly define cross-reference?

标签 database haskell model haskell-persistent

假设您有两个模型(FooBar)并且它们都相互引用(FoobarRef 类型为 BarIdBarfooRef 类型为 FooId)。一切顺利:

#!/usr/bin/env stack
{- stack script --resolver=lts-9.21 --package=persistent-template -}
{-# LANGUAGE GADTs, GeneralizedNewtypeDeriving, QuasiQuotes, TemplateHaskell #-}
{-# LANGUAGE TypeFamilies, MultiParamTypeClasses #-}

import Database.Persist.TH

mkPersist sqlSettings [persistLowerCase|
Foo
  barModel BarId
  fooField Int

Bar
  fooModel FooId
  barField Int
|]

main = pure ()

但是如果我将引用类型包装为Maybe(只是一个例子,它可以是Vector 或其他任何类型):

#!/usr/bin/env stack
{- stack script --resolver=lts-9.21 --package=persistent-template -}
{-# LANGUAGE GADTs, GeneralizedNewtypeDeriving, QuasiQuotes, TemplateHaskell #-}
{-# LANGUAGE TypeFamilies, MultiParamTypeClasses #-}

import Database.Persist.TH

mkPersist sqlSettings [persistLowerCase|
Foo
  barModel (Maybe BarId)
  fooField Int

Bar
  fooModel FooId
  barField Int
|]

main = pure ()

失败并出现此错误:

Not in scope: type constructor or class ‘BarId’

我应该如何解决这个问题?

最佳答案

您用于 Bar 模型的语法不正确。这样的事情应该有效:

#!/usr/bin/env stack
-- stack script --resolver lts-12.7

{-# LANGUAGE GADTs, GeneralizedNewtypeDeriving, QuasiQuotes, TemplateHaskell #-}
{-# LANGUAGE TypeFamilies, MultiParamTypeClasses #-}

import Database.Persist.TH

mkPersist sqlSettings [persistLowerCase|
Foo
  barModel BarId Maybe
  fooField Int

Bar
  fooModel FooId
  barField Int
|]

main = pure ()

参见 official docs供引用。

关于database - haskell "persistent"模型 : How to correctly define cross-reference?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52247307/

相关文章:

database - 将数据存储在文件名与内部文件中

model - 在 Ember 中将模型属性插入到 Img 元素 URL

c++ - 使用自定义 QSortFilterProxyModel 覆盖哪些函数

entity-framework - 如何让所有实体访问 :internal instead of public in EDMX?

sql - 在默认文件组以外的文件组上创建表

c# - 没有第三类的 Linq to SQL 多对多关系

android - SQlite 数据库 : Unable to find context

haskell - 插入Data.Set并检查元素是否同时存在

haskell - 自定义流类型如何影响位置信息。秒差距?

haskell - 在haskell中解析html