[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Questions on using orm



Hi,

Two answers to your questions:

=== Answer 1 (the direct answer) ===

> Question 1: is there any way to actually use foreign keys to query?
> 
> I would like to do basically:
> 
> SELECT c.* from Chapter c, Book b where b.book_name = "My book";

You can use custom functions:

let get_chapters_by_book_name db book_name =
  chapter_get db ~custom:(fun c -> c.chapter_fk_book.book_name = book_name)

> ---
> Question 2: is there any way to do cascading deletes?
> 
> chapter_delete ~recursive:true ~db:chapter_db some_chapter
> 
> This does something I cannot really envision ever needing...It allows me to 
> delete the chapter _and_ the book (doesn't really seem like something too 
> natural), where as I would like the reverse to actually happen:
> 
> book_delete ~recursive:true ~db:book_db some_book
> 
> I would expect this to delete the book and everything that actually keeps 
> foreign keys to the book item, much like cascading deletes in SQL.
> 
> Instead, at the moment, I have to query for the book object, then use it to 
> query for all chapters underneath, use each to call chapter_delete 
> individually, and afterwards delete the book. There is something here that 
> feels it won't just be optimized away for me :)

This is not possible (as there is no notion of foreign key in ORM). For a 
better solution, see answer 2.

== Answer 2 (the indirect one) ==

> type book = {
>   book_name : string;
> } and chapter = {
>   chapter_fk_book : book;
>   chapter_name : string;
> } with orm

This is not the most natural way to define book/chapters if you would do it 
without persistence in mind. For instance, I would do:

type book = {
  book_name     : string;
  book_chapters: chapter list;
} and chapter = {
  chapter_name = string;
} with orm

let get_chapters_by_book_name db book_name =
  match get_book db ~book_name:(`Eq book_name) with
  | []   -> []
  | [b] -> b.chapters
 | _    -> failwith "too many books with the same name"

and then recursive deletion works as expected.

Hope this helps,
Thomas




 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.