2014-05-11 15 views
1

Snap Framework有關於如何使用snaplets編寫web應用程序的教程。有一個連接到MySQL的零件,Snap.Snaplets.MysqlSimple,這取決於庫Database.MySQL.Simple,它看起來大概是一個簡單的包裝來保持連接句柄的隱含。如何使用Snap的MysqlSimple連接到MySQL snaplet

文檔中可用的唯一示例不起作用。如a 2011 Haskell-cafe post(!)所述,該示例在可以派生結果類型之前缺少一些類型註釋。是否有一個連接到MySQL並獲取一些結果的功能齊全的Snap應用程序的簡單示例?

附加問題:我想更改MySQL連接設置。運行該應用程序將創建一個名爲snaplets/mysql-simple/devel.cfg的文件。即使在重新編譯,重新啓動和/或重新加載之後,更改此文件中的設置似乎也不會影響應用程序。

回答

2

下面的示例使用MySQL默認的連接設置:

{-# LANGUAGE TemplateHaskell #-} 
{-# LANGUAGE OverloadedStrings #-} 

module Main where 

import Snap 
import Snap.Snaplet 
import Snap.Snaplet.Heist 
import Snap.Snaplet.MysqlSimple 

import Control.Lens.TH 

import Data.Int 
import Data.Maybe 
import qualified Data.Text as T 

data App = App 
    { _heist  :: Snaplet (Heist App) 
    , _db   :: Snaplet Mysql 
    } 

makeLenses ''App 

instance HasHeist App where 
    heistLens = subSnaplet heist 

main :: IO() 
main = serveSnaplet defaultConfig appInit 

appInit :: SnapletInit App App 
appInit = makeSnaplet "myapp" "Some application" Nothing $ do 
    h <- nestSnaplet "heist" heist $ heistInit "templates" 
    d <- nestSnaplet "db" db mysqlInit 
    addRoutes [ ("/", defaultHandler), ("", heistServe) ] 
    return $ App h d 

defaultHandler :: Handler App App() 
defaultHandler = do 
    ns <- q 
    forM_ ns $ \ (Only i) -> 
    writeText $ T.concat [ "id = ", T.pack (show i), "\n"] 

q :: Handler App App [Only Int64] 
q = with db $ query_ ("select id from sometable")