[Haskell-cafe] ORM for haskell?

Chris Eidhof chris at eidhof.nl
Fri Jul 3 06:51:20 EDT 2009


On 3 jul 2009, at 11:28, Jochem Berndsen wrote:

> Chris Eidhof wrote:
>> I've something working that sort of does this. You define your  
>> model in
>> the following way:
>>
>> data User = User {name :: String, password :: String, age :: Int,  
>> post
>> :: BelongsTo Post}
>> data Post = Post {title :: String, body :: String}
>>
>> Then there's some boilerplate code (that ultimately will be  
>> generated by
>> TH), and from that moment on you can do things like this:
>>
>> test = do
>>  conn <- connectSqlite3 "example.sqlite3"
>>  runDB conn $ do
>>    user <- fromJust <$> find typeUser 1
>>    user' <- fillBelongsTo user relPost
>>    return (post user')
>
>
>> By default, no relations will be fetched, but by doing the  
>> fillBelongsTo
>> the user will be updated. I currently have support for new, update  
>> and
>> find. All of this code is very alpha, and only works using HDBC and
>> Sqlite3, but still.
>
> So in this example, both user and user' are of type User, but if I ask
> for "post user", this is undefined?
> I have done something similar as you, except that I filled the related
> field with an unsafePerformIO fetching the related data from the  
> database.

No, it will never be undefined. The BelongsTo datatype is defined as  
following:

data BelongsTo a = BTNotFetched | BTId Int | BTFetched (Int, a)
So either there is no information available (BTNotFetched), we know  
the id (the foreign key, BTId) or we know the id and the value  
(BTFetched). It is currently just a proof of concept, but for me, an  
extend version of this will do. I think that almost every mapping from  
Haskell datatypes to a RDBMS will be slightly awkward, this is my way  
to find a balance ;)

-chris


More information about the Haskell-Cafe mailing list