問題タブ [haskell-persistent]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
haskell - Yesod で Key の値を返すにはどうすればよいですか?
Yesod でリソース用の REST API を作成しています。指定されたリソースを作成しようとする POST メソッドがあり、成功した場合は 201 と新しく作成されたリソースの ID を返します。例えば、
これは私が得るエラーです。これは十分に明白です:
の何かが欲しいのはわかっていますが、Database.Persist.ClassToTypedContent
の からそれを取得する方法が見つかりません。Key
どんな助けでも大歓迎です。
編集:
実際のリソースの定義は次のとおりです。
mysql - 既存のデータベースから永続エンティティ定義を生成するツールはありますか?
persistent-template
エンティティを宣言するために使用できることは理解していますが、既存のデータベースからそれらを構築するためのツールはありますか? 具体的には、MySQL データベースを指定して Persistent で使用できる定義を返すツールはありますか?
haskell - 整数キーを指定して永続レコードを取得しますか?
Servant で Persistent を使用しようとしているので、URL セグメントを Persistent キーに自動的に解析する余裕がありません。代わりに、 を要求するようにルートを設定しましたInt64
。それを使用してレコードを取得し、主キー ルックアップを実行したいと考えています。
私が見つけたものはすべて 、整数をキーに変換するために使用することを示しているので、それを行う非常に単純な関数を作成しようとしました:toSqlKey
残念ながら、これはうまくいきませんでした。次のタイプのエラーが発生しました。
私はget
このエラーをある程度理解しています —との型を調べたところtoSqlKey
、関連する制約が含まれています。
私が正しく理解し、同じタイプである必要があるbackend
が、制約を適用すると、タイプが一致しなくなります。私の直感では、 であるはずですが、明らかに間違っています。理由や方法はわかりませんが。PersistEntityBackend val
toSqlKey
SqlBackend
PersistentEntityBackend (Entity Record)
SqlBackend
とにかく、その分析が正しいか間違っているかはわかりませんが、いずれにせよ、これを修正する方法やこれを行う適切な方法はわかりません. 整数を指定してデータベースからレコードを取得するにはどうすればよいですか?
database - Transformer スタックでのデータベース アクセスの処理
この質問はgroundhog
またはに関するものですpersistent
。どちらも同じ問題を共有していると私は信じているからです。
Tr m a
いくつかの機能を提供するトランスがあるとしますf :: Int -> Tr m ()
。この機能には、データベースへのアクセスが必要です。ここで使用できるオプションはいくつかありますが、満足できるものはありません。
DbPersist
のどこかに変圧器を置くことができTr
ます。実際には、標準のトランスフォーマーのインスタンスがなく、さらにnewtypePersistBackend
のインスタンスを作成する必要があるため、これを一番上に配置する必要があります。Tr
クラスが最小からかけ離れているため、これはすでにひどいものです。私が行うすべての db アクションを持ち上げることもできます。
もう 1 つのオプションは、 の署名を に変更するf
ことPersistBackend m => Int -> Tr m ()
です。これもまた、私のnewtype でPersistBackend
インスタンスを作成するか、リフティングする必要があります。Tr
ここからが本当の問題です。すでに制約Tr
があるコンテキスト内で実行するにはどうすればよいですか? PersistBackend
と共有する方法はありませんTr
。
最初のオプションを実行して、いくつかの新しい接続プールDbPersist
内で実際のトランスフォーマーを実行するTr
ことができます (私が既にいるコンテキストからプールを取得する方法がないことがわかる限りPersistBackend
)、または 2 番目のオプションを実行することができます。実行関数を にしますrunTr :: PersistBackend m => Tr m a -> m a
。2番目のオプションは実際には完全に問題ありませんが、ここでの問題は、DbPersist
最終的にスタックのどこかになければならない が、現在トランスフォーマーの下にあり、構成されている標準トランスフォーマーのインスタンスTr
がないことです。PersistBackend
Tr
ここで正しいアプローチは何ですか?現時点では、ReaderT
リクエストに応じて接続プールを提供するスタックのどこかにセパタレrunDbConn
を使用し、DB にアクセスしたいすべての場所でそのプールを使用するのが最善の選択肢のようです。DbPersist
基本的にすでにそれがいかに重要であるかを見ると、ReaderT
それをしなければならないことに意味がありません。