0

Servant で Persistent を使用しようとしているので、URL セグメントを Persistent キーに自動的に解析する余裕がありません。代わりに、 を要求するようにルートを設定しましたInt64。それを使用してレコードを取得し、主キー ルックアップを実行したいと考えています。

私が見つけたものはすべて 、整数をキーに変換するために使用することを示しているので、それを行う非常に単純な関数を作成しようとしました:toSqlKey

runDB :: (MonadBaseControl IO m, MonadIO m) => (SqlPersistT (NoLoggingT (ResourceT m))) a -> m a
runDB actions = do
  filename <- liftIO $ getEnv "SQLITE_FILENAME"
  runSqlite (pack filename) actions

getRecordByKey :: Int64 -> IO (Maybe (Entity Record))
getRecordByKey recordId = runDB $ get (toSqlKey recordId)

残念ながら、これはうまくいきませんでした。次のタイプのエラーが発生しました。

Couldn't match expected type ‘PersistEntityBackend
                                (Entity Record)’
            with actual type ‘SqlBackend’
In the second argument of ‘($)’, namely ‘get (toSqlKey recordId)’
In the expression: runDB $ get (toSqlKey recordId)
In an equation for ‘getRecordByKey’:
    getRecordByKey recordId = runDB $ get (toSqlKey recordId)

getこのエラーをある程度理解しています —との型を調べたところtoSqlKey、関連する制約が含まれています。

get :: (MonadIO m, backend ~ PersistEntityBackend val, PersistEntity val) => Key val -> ReaderT backend m (Maybe val)
toSqlKey :: ToBackendKey SqlBackend record => Int64 -> Key record

私が正しく理解し、同じタイプである必要があるbackendが、制約を適用すると、タイプが一致しなくなります。私の直感では、 であるはずですが、明らかに間違っています。理由や方法はわかりませんが。PersistEntityBackend valtoSqlKeySqlBackendPersistentEntityBackend (Entity Record) SqlBackend

とにかく、その分析が正しいか間違っているかはわかりませんが、いずれにせよ、これを修正する方法やこれを行う適切な方法はわかりません. 整数を指定してデータベースからレコードを取得するにはどうすればよいですか?

4

2 に答える 2

1

/Key recordのインスタンスを直接作成し、URL のキーを直接使用するのはどうでしょうか?FromTextToText

{-# LANGUAGE FlexibleContexts               #-}
{-# LANGUAGE UndecidableInstances               #-}
instance ToBackendKey SqlBackend record => FromText (Key record) where
  fromText k = toSqlKey <$> fromText k
instance ToBackendKey SqlBackend record => ToText (Key record) where
  toText = toText . fromSqlKey
于 2015-11-29T13:31:55.927 に答える