haskellday rf
TRANSCRIPT
Persistent の使い方~ Yesod で使っている Persistent を単体で使う話 ~
rf
自己紹介rf
@rf0444
最近ホットな言語
Haskell
今読んでいる本
「Learn You a Haskell for Great Good!」 (10章)
Persistent
Yesod を入れると一緒に入ってくるやつ
DB 部分をやってくれる
型安全
Persistent
使えるDB
SQLite
MongoDB
PostgreSQL
MySQL (experimental)
インストール共通
cabal install persistent-template
SQLite
cabal install persistent-sqlite
MongoDB
cabal install persistent-mongoDB
インストール共通
cabal install persistent-template
PostgreSQL
cabal install persistent-postgresql
MySQL
cabal install persistent-mysql
つないでみる
つないでみるSQLite
{-# LANGUAGE OverloadedStrings #-}
import Database.Persist.Sqlite
main = withSqliteConn path $ runSqlConn $ do return () where path = "hogesql.sqlite3"
つないでみるMongoDB
{-# LANGUAGE OverloadedStrings #-}
import Database.Persist.MongoDB
main = withMongoDBConn dbname hostname $ runMongoDBConn master $ do return () where hostname = "localhost" dbname = "test"
つないでみるPostgreSQL
{-# LANGUAGE OverloadedStrings #-}
import Database.Persist.Postgresql
main = withPostgresqlConn conf $ runSqlConn $ do return () where conf = "host=localhost port=5432 user=hoge dbname=hoge password=hoge"
つないでみるMySQL
import Database.Persist.MySQL
main = withMySQLConn conf $ runSqlConn $ do return () where conf = defaultConnectInfo { connectHost = "localhost" -- default connectPort = 3306 -- default connectUser = "hoge" -- default : “root” connectPassword = "hoge" -- default : no password connectDatabase = "hoge" -- default : “test” }
Model の定義
Yesod の Model を使いたい
import 部分に Yesod に依存する部分があるので、
そこだけ切り離す
言語拡張をコード側へ
Model の定義Yesod の Model.hs (SQLite)
model Model where
import Preludeimport Yesodimport Data.Text (Text)import Database.Persist.Quasi
share [mkPersist sqlSettings, mkMigrate "migrateAll"] $(persistFileWith lowerCaseSettings "config/models")
Model の定義Model.hs (SQLite)
{-# LANGUAGE TypeFamilies, TemplateHaskell, FlexibleContexts, GADTs #-}
model Model where
import Data.Text (Text)import Database.Persist.Quasiimport Database.Persist.Sqliteimport Database.Persist.TH
share [mkPersist sqlSettings, mkMigrate "migrateAll"] $(persistFileWith lowerCaseSettings "config/models")
Model の定義Yesod の Model.hs (MongoDB)
model Model where
import Preludeimport Yesodimport Data.Text (Text)import Database.Persist.Quasiimport Database.Persist.MongoDBimport Language.Haskell.TH.Syntax
share [mkPersist MkPersistSettings { mpsBackend = ConT ''Action }, mkMigrate "migrateAll"] $(persistFileWith lowerCaseSettings "config/models")
Model の定義Model.hs (MongoDB)
{-# LANGUAGE TypeFamilies, TemplateHaskell, FlexibleContexts, GADTs #-}
model Model where
import Data.Text (Text)import Database.Persist.Quasiimport Database.Persist.MongoDBimport Database.Persist.THimport Language.Haskell.TH.Syntax
share [mkPersist MkPersistSettings { mpsBackend = ConT ''Action }, mkMigrate "migrateAll"] $(persistFileWith lowerCaseSettings "config/models")
Model の定義config/model
User email Text password Text Maybe UniqueUser email
マイグレーション
実行時に、テーブルがなかったら作ったりしてくれるやつ
RDB 系で使える
MongoDB も unique index とかやってくれればいいのに・・・
マイグレーションSQLite
{-# LANGUAGE OverloadedStrings #-}
import Database.Persist.Sqliteimport Model
main = withSqliteConn path $ runSqlConn $ do runMigration migrateAll return () where path = "hogesql.sqlite3"
マイグレーションSQLite
$ ls -FModel.hs config/ main.hs
マイグレーションSQLite
$ ls -FModel.hs config/ main.hs$ runhaskell main.hs
マイグレーションSQLite
$ ls -FModel.hs config/ main.hs$ runhaskell main.hs Migrating: CREATE TABLE "user"("id" INTEGER PRIMARY KEY,"email" VARCHAR NOT NULL,"password" VARCHAR NULL,CONSTRAINT "unique_user" UNIQUE ("email"))
マイグレーションSQLite
$ ls -FModel.hs config/ main.hs$ runhaskell main.hs Migrating: CREATE TABLE "user"("id" INTEGER PRIMARY KEY,"email" VARCHAR NOT NULL,"password" VARCHAR NULL,CONSTRAINT "unique_user" UNIQUE ("email"))$ ls -FModel.hs config/ hogesql.sqlite3 main.hs
マイグレーションSQLite
$ ls -FModel.hs config/ main.hs$ runhaskell main.hs Migrating: CREATE TABLE "user"("id" INTEGER PRIMARY KEY,"email" VARCHAR NOT NULL,"password" VARCHAR NULL,CONSTRAINT "unique_user" UNIQUE ("email"))$ ls -FModel.hs config/ hogesql.sqlite3 main.hs$ sqlite3 hogesql.sqlite3 .tableuser
あとは
{-# LANGUAGE OverloadedStrings #-}
import Database.Persist.Sqliteimport Model
main = withSqliteConn path $ runSqlConn $ do runMigration migrateAll insert $ User { userEmail = "[email protected]", userPassword = Just "hoge" } return () where path = "hogesql.sqlite3"