2015年6月23日火曜日

Persistentがまともに動きません

SelectOneManyとかもうないのか...


二日酔いが続く中、Database.Persist.Query.Join (SelectOneMany (..), selectOneMany)のあたりの関数がごっそりなくなっていて、嗚咽を模様した今日この頃です。

この辺の記事(「Yesod Web Framework SQL Join」)がそれっぽいようなことを書いてあるような気配がするのですが、英語も読む気力がないので、どなたか訳してくれないでしょうか...Orz

そんなことはいいとして、適当に書き換えてみました、データベースに入っているデータを単純に読み込むだけですが

データはこんな感じ
cuomo@karky7 ~ $ mysql -u root SAMPLEDB
Reading table information for completion of table and column names
...
...
mysql> SELECT * FROM Person;
+----+-------------------+------+
| id | name              | age  |
+----+-------------------+------+
| 11 | Kazuto Ando       |   40 |
| 12 | Yoshirou Dorumaki |   41 |
+----+-------------------+------+
2 rows in set (0.00 sec)

mysql> 
で、haskellのコード、Persistent MySQLを利用しています

{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE QuasiQuotes #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE FlexibleContexts #-}
import Database.Persist
import Database.Persist.MySQL
import Database.Persist.TH
import Data.Int
import Control.Monad.Logger (runNoLoggingT, MonadLogger)
import Control.Monad.IO.Class
import Control.Monad.Trans.Control (MonadBaseControl)

share [mkPersist sqlSettings] [persistUpperCase|
Person
    name String
    age Int Maybe
    deriving(Show)
BlogPost
    title String
    authorId PersonId
    deriving(Show)
|]

main :: IO ()
main = do
  person <- getPerson 11
  case person of
    Just p -> dispPerson (personName p) (personAge p)
    Nothing -> putStrLn "Nothing"

dispPerson :: String -> Maybe Int -> IO ()
dispPerson name (Just age) = putStrLn $ name ++ "\n" ++ show(age)
dispPerson name Nothing = putStrLn name

getPerson :: (MonadBaseControl IO m,
                        MonadIO m) => Int64 -> m (Maybe Person)
getPerson n = runNoLoggingT $ getConn $ runSqlConn $ do
   get (toSqlKey n)


getConn :: (MonadBaseControl IO m,
            MonadIO m,
            MonadLogger m) => (SqlBackend -> m a) -> m a
getConn = withMySQLConn getConnection

getConnection :: ConnectInfo
getConnection = ConnectInfo {
    connectHost = "localhost",
    connectPort = 3306,
    connectUser = "root",
    connectPassword = "",
    connectDatabase = "SAMPLEDB",
    connectOptions = [],
    connectPath = "",
    connectSSL = Nothing
}

そしたら、11番目の「かずと」を抜いてみる、最近、プロマネ的な仕事をこなしているっぽい、出世したらしい
*Main> :load "/home/cuomo/Code/yesod/Persistent/PersistMySQL.hs"
[1 of 1] Compiling Main       ( /home/cuomo/Code/yesod/Persistent/PersistMySQL.hs, interpreted )
Ok, modules loaded: Main.
*Main> main
Kazuto Ando
40
*Main>
こんだけです、気持ちが悪いので止めておきます...


0 件のコメント:

コメントを投稿