Database relations mapping

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
2 messages Options
Reply | Threaded
Open this post in threaded view
|

Database relations mapping

Radosław Grzanka-2
Hi,
  I'm developing toy application to learn HDBC. I have "problem" with
doing relations mapping. Actually I don't know is it a problem or
"feature". ;)

Anyway, I have two tables with relation between them:

(this example is simplified to the whole structure of database, you can imagine)

CREATE TABLE TD_set (
         setId INTEGER PRIMARY KEY,
         setName TEXT NOT NULL
         )

CREATE TABLE TO_card (
         cardId INTEGER PRIMARY KEY AUTOINCREMENT,
         setId INTEGER NOT NULL,"                       -- Relation to TD_set
         setSeq INTEGER NOT NULL
         )

(no foreign key as sqlite3 does not care anyway - at least AFAIK)

And in Haskell:

> type CardSet = String
>
> data Card = Card {
>    set             :: CardSet,
>    seqNo        :: Integer,
> }

There is no problem with filling the structure Card with "seqNo" but I
can't fill "set". I would have to put there IO (CardSet) but I don't
want to do that as whole structure returned from my mapping function
is already inside IO monad. Can I do it?

Here is my (perfect) function - http://hpaste.org/5839 . See
"getCards" and some helper functions. This does not compile as (I
believe) getElement wants to return IO (CardSet)

Thank you in advance for all your input.
Radek.
_______________________________________________
Haskell-Cafe mailing list
[hidden email]
http://www.haskell.org/mailman/listinfo/haskell-cafe
Reply | Threaded
Open this post in threaded view
|

Re: Database relations mapping

Bugzilla from jonathanccast@fastmail.fm
On 23 Feb 2008, at 3:30 AM, Radosław Grzanka wrote:

> Hi,
>   I'm developing toy application to learn HDBC. I have "problem" with
> doing relations mapping. Actually I don't know is it a problem or
> "feature". ;)
>
> Anyway, I have two tables with relation between them:
>
> (this example is simplified to the whole structure of database, you  
> can imagine)
>
> CREATE TABLE TD_set (
>          setId INTEGER PRIMARY KEY,
>          setName TEXT NOT NULL
>          )
>
> CREATE TABLE TO_card (
>          cardId INTEGER PRIMARY KEY AUTOINCREMENT,
>          setId INTEGER NOT NULL,"                       -- Relation  
> to TD_set
>          setSeq INTEGER NOT NULL
>          )
>
> (no foreign key as sqlite3 does not care anyway - at least AFAIK)
>
> And in Haskell:
>
>> type CardSet = String
>>
>> data Card = Card {
>>    set             :: CardSet,
>>    seqNo        :: Integer,
>> }
>
> There is no problem with filling the structure Card with "seqNo" but I
> can't fill "set". I would have to put there IO (CardSet) but I don't
> want to do that as whole structure returned from my mapping function
> is already inside IO monad. Can I do it?

> Here is my (perfect) function - http://hpaste.org/5839 . See
> "getCards" and some helper functions. This does not compile as (I
> believe) getElement wants to return IO (CardSet)
>
> Thank you in advance for all your input.

You want to put toItem into the IO monad:

toItem [cardId, setId, setSeq] = do
   set_ <- getElement
   return $ Card {
     set          = set_
     seqNo        = fromSql setSeq,
     }
toItem x = fail ("Unexpected result in getCards: " ++ (show x))

Then use

mapM toItem cards

instead of

return $ map toItem cards

jcc

_______________________________________________
Haskell-Cafe mailing list
[hidden email]
http://www.haskell.org/mailman/listinfo/haskell-cafe