[Haskell-cafe] Handling Postgresql array types

Tom Ellis tom-lists-haskell-cafe-2013 at jaguarpaw.co.uk
Sat Dec 27 12:09:46 UTC 2014

On Sat, Dec 27, 2014 at 11:23:36AM +0000, Tom Ellis wrote:
> > PS. I started looking into Opaleye as a possible DSL and would appreciate 
> > any help you can give me in figuring out how to represent arrays in that. 
> >  I am assuming I need to do something with queryRunnerColumn but I was not 
> > able to understand the example.
> This is indeed somewhat fiddly to do because it requires fiddling with the
> implementation of postgresql-simple instances.  Unfortunately that library
> does not provide us with enough primitives to do this directly.

OK, I just pushed a patch to GitHub


Now you can do the below.  You can't actually do anything with your arrays
yet except just read them from tables and return them from `runQuery` but
let me know what functionality you want and I will endevour to support it.

import           Database.PostgreSQL.Simple (execute_, ConnectInfo(..), connect)
import           Data.String (fromString)
import           Opaleye

connectInfo :: ConnectInfo
connectInfo =  ConnectInfo { connectHost = "localhost"
                           , connectPort = 25433      
                           , connectUser = "tom"
                           , connectPassword = "tom"
                           , connectDatabase = "opaleye_test" }

table :: Table (Column (PGArray (PGArray PGInt4)))
               (Column (PGArray (PGArray PGInt4)))
table = Table "arraytable" (required "colname")

query :: Query (Column (PGArray (PGArray PGInt4)))
query = queryTable table

main :: IO ()
main = do
  conn <- connect connectInfo

  let q = execute_ conn . fromString

  q "DROP TABLE IF EXISTS arraytable"
  q "CREATE TABLE arraytable (colname integer[][])"
  q "INSERT INTO arraytable VALUES ('{{1,2}, {3,4}}'), ('{{5,6}, {7,8}}')"

  results' <- runQuery conn query :: IO [[[Int]]]
  print results'

-- ghci> main
-- [[[1,2],[3,4]],[[5,6],[7,8]]]

More information about the Haskell-Cafe mailing list