簡體   English   中英

Haskell 持久化 - 通過外鍵獲取價值

[英]Haskell persistent - getting value via foreign key

讓我們假設我有一個非常簡單的帶有外鍵的數據庫(為了簡單起見:一個帶有自我引用的表;上下文 - 對金融工具建模):

Instrument
    ticker String
    name String
    denomination InstrumentId -- FK !!
    domicile Country
    source DataSource
    UniqueT ticker
    deriving Eq Show

然后我可以通過執行來獲取所有行:

getAll :: (MonadIO m, MonadLogger m) => SqlReadT m [Entity Instrument]
getAll = select $ from $ return

我注意到我可以使用自動生成的函數從結果中提取特定字段,例如

getTicker :: Entity Instrument -> String
getTicker = instrumentTicker . entityVal

但是,當我嘗試引用通過外鍵引用的值時,我得到:

getDenomination :: Entity Instrument -> Key Instrument
getDenomination = instrumentDenomination . entityVal

我的問題:我如何引用與接收到的“Key Instrument”相對應的剩余值,例如如何獲取引用記錄的“name”字段?

編輯:

我試過寫一個子查詢,但到目前為止還不好。 我嘗試的是:

getInstrumentByKey :: (MonadIO m, MonadLogger m) => Key Instrument -> SqlBackendT m (Entity Instrument)
getInstrumentByKey key =
    select $ from $ \i ->
        where_ (i ^. InstrumentId ==. key)  -- type error, InstrumentKey is of type "SqlExpr (Value (Key Instrument))", while key is "Key Instrument"
        return i

如何在我的子查詢中正確使用“Key Instrument”參數?

稍微擴展一下我在評論中所說的話:

總的來說,您有兩種選擇。 一種是按 ID 進行另一次查找,如Persistent 文檔中所述(請參閱“按 ID 獲取”部分)。 這並不理想,因為它涉及對數據庫的第二次訪問。

但由於您顯然使用的是 SQL 數據庫,這正是連接的用途。 而且您已經在使用 Esqueleto,它允許您將 SQL 查詢 - 包括連接(您無法僅用 Persistent 表達) - 轉換為 Haskell。 在這種情況下,您將使用denomination字段和 ID 將您的表連接到其自身上。 同樣,圖書館的文檔很容易理解。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM