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 val
toSqlKey
SqlBackend
PersistentEntityBackend (Entity Record)
SqlBackend
とにかく、その分析が正しいか間違っているかはわかりませんが、いずれにせよ、これを修正する方法やこれを行う適切な方法はわかりません. 整数を指定してデータベースからレコードを取得するにはどうすればよいですか?