haskellday rf

27
Persistent の使い方 Yesod で使っている Persistent を単体で使う話 rf

Upload: rf0444

Post on 20-Jun-2015

1.580 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: Haskellday rf

Persistent の使い方~ Yesod で使っている Persistent を単体で使う話 ~

rf

Page 2: Haskellday rf

自己紹介rf

@rf0444

最近ホットな言語

Haskell

今読んでいる本

「Learn You a Haskell for Great Good!」 (10章)

Page 3: Haskellday rf

Persistent

Yesod を入れると一緒に入ってくるやつ

DB 部分をやってくれる

型安全

Page 4: Haskellday rf

Persistent

使えるDB

SQLite

MongoDB

PostgreSQL

MySQL (experimental)

Page 5: Haskellday rf

インストール共通

cabal install persistent-template

SQLite

cabal install persistent-sqlite

MongoDB

cabal install persistent-mongoDB

Page 6: Haskellday rf

インストール共通

cabal install persistent-template

PostgreSQL

cabal install persistent-postgresql

MySQL

cabal install persistent-mysql

Page 7: Haskellday rf

つないでみる

Page 8: Haskellday rf

つないでみるSQLite

{-# LANGUAGE OverloadedStrings #-}

import Database.Persist.Sqlite

main = withSqliteConn path $ runSqlConn $ do return () where path = "hogesql.sqlite3"

Page 9: Haskellday rf

つないでみるMongoDB

{-# LANGUAGE OverloadedStrings #-}

import Database.Persist.MongoDB

main = withMongoDBConn dbname hostname $ runMongoDBConn master $ do return () where hostname = "localhost" dbname = "test"

Page 10: Haskellday rf

つないでみる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"

Page 11: Haskellday rf

つないでみる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” }

Page 12: Haskellday rf

Model の定義

Yesod の Model を使いたい

import 部分に Yesod に依存する部分があるので、

そこだけ切り離す

言語拡張をコード側へ

Page 13: Haskellday rf

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")

Page 14: Haskellday rf

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")

Page 15: Haskellday rf

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")

Page 16: Haskellday rf

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")

Page 17: Haskellday rf

Model の定義config/model

User email Text password Text Maybe UniqueUser email

Page 18: Haskellday rf

マイグレーション

実行時に、テーブルがなかったら作ったりしてくれるやつ

RDB 系で使える

MongoDB も unique index とかやってくれればいいのに・・・

Page 19: Haskellday rf

マイグレーションSQLite

{-# LANGUAGE OverloadedStrings #-}

import Database.Persist.Sqliteimport Model

main = withSqliteConn path $ runSqlConn $ do runMigration migrateAll return () where path = "hogesql.sqlite3"

Page 20: Haskellday rf

マイグレーションSQLite

$ ls -FModel.hs config/ main.hs

Page 21: Haskellday rf

マイグレーションSQLite

$ ls -FModel.hs config/ main.hs$ runhaskell main.hs

Page 22: Haskellday rf

マイグレーション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"))

Page 23: Haskellday rf

マイグレーション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

Page 24: Haskellday rf

マイグレーション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

Page 25: Haskellday rf

あとは

{-# 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"

Page 26: Haskellday rf

あとは

$ runhaskell main.hs

$ sqlite3 hogesql.sqlite3 "select * from user"1|[email protected]|hoge

Page 27: Haskellday rf