2016-12-19 8 views
1

persistというSQLテーブルがあると仮定し、自動インクリメントのInt64キーの代わりにプライマリキーとしてTextというカスタムを持っているとします。Yesod:カスタムプライマリキーを使用して `persist`データベースにクエリする

例えば、私のデータベースの定義はこれです:

私はその後、平野 Text値を持って、私の Textに一致する主キーを持つ行のためのデータベースを照会するための慣用的な方法は何であると仮定すると
share [mkPersist sqlSettings, mkMigrate "migrateAll"] [persistLowerCase| 
TorrentD 
    infoHash Text 
    ipAddr [Text] 
    Primary infoHash 
    deriving Show 
|] 

値? runDB $ get $ toSqlKey ("test" :: Text)toSqlKeyはカスタムプライマリキーをサポートしていないため、Int64が必要です。

キーを手動で作成してrunDB $ get $ Key $ PersistText ("test" :: Text)を実行すると、Keyが範囲外であるというエラーが表示されます(私のインポートではDatabase.Persist.Class)。

+0

私は、永続的な上記のスキーマがプライマリキーをテキストにするとは思わない。 'Primary infoHash'行はあなたのスキーマに一意制約を追加するだけです。主キーはまだ 'Int64'です。 dbを検査して確認することができます。 – Sibi

+0

スキーマは 'CREATE TABLE" torrent_d "(" info_hash "VARCHAR NOT NULL、" ip_addr "VARCHAR NOT NULL、PRIMARY KEY(" info_hash "))'です。 カスタムプライマリキーを作成するメカニズムは、[ここに記載されています](https://github.com/yesodweb/persistent/wiki/Persistent-entity-syntax#primary-and-foreign-keys)です。 – stalin

+0

ええ、そうです。 – Sibi

答えて

1

私は(?)(?)の答えを見つけました。あまりにもかわいいですが、

get (TorrentDKey {unTorrentDKey = torrentPInfoHash torrent}) 

作品です。

unTorrentDKeyは、テンプレートhaskellの内部で生成されたものです。

私は私のコードで唐辛子の周り

let primaryKey = TorrentDKey {unTorrentDKey = torrentPInfoHash torrent} 

にありますように見えます。

+0

これは正しい方法です。 – Sibi

関連する問題