On 23 Oct 2008, at 10:31, Drew Taylor wrote:

On Fri, Oct 17, 2008 at 4:17 PM, Yves Räber <[EMAIL PROTECTED]> wrote:
And That's the piece of code that I'm trying to make work :

my $extensions = $c->model('MyApp::Batch')->search(
{
state => ['STOPPED', 'ARCHIVED', 'DONE']
}
)->search_related('script')->search_related('astextensions');

Now if I try $extensions->delete , this is what I get (I have to admit I
don't really understand why I get this):

I'm not a DBIC guru by any means, but I ran into a situation like this
recently where all the chained calls weren't being followed and the
solution was to run all methods (search->search->search in my case) in
a single call. Maybe try:
...->search_related('script')->search_related('astextensions')- >delete;


Strangely we were having a discussion about this on irc yesterday.

The bottom line is basically a DELETE that involves a join will not generate correct SQL. This is at least partly down to the SQL spec not really supporting that sort of complexity in a DELETE statement, although some implementations of SQL (I think PostgreSQL is one) will do so, however the SQL generator does not generate anything sensible in this case.

A way around this would be to use a subselect, except DBIC doesn't support this well at present (you can force it by putting literal SQL in your query, but you are on your own here).

I transformed a query into another form something like:-
  $schema->resultset('Target')->search({thing =>
     {-in => [ $schema->resultset('Source')->search(
       {seomthing => 'whatever'})->get_column('id')->all]}});

However that made the db explode when the IN clause generated had more than 15,000 entries :-)

The other method you can use, that should work everywhere, is to use delete_all in place of delete, but this pulls all the objects back into perl which is a pain.

Anyhow, suggested changes for now were:-
  - add additional bits to documentation for ResultSet delete and
    delete_all to explain the problem

  - modify delete to either die or warn when it is applied to a
    rs with joins in it.

If anyone has good wording for the doc changes in particular I can look at making these changes.

        Nigel.
--
[ Nigel Metheringham             [EMAIL PROTECTED] ]
[ - Comments in this message are my own and not ITO opinion/policy - ]


_______________________________________________
List: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/dbix-class
IRC: irc.perl.org#dbix-class
SVN: http://dev.catalyst.perl.org/repos/bast/DBIx-Class/
Searchable Archive: http://www.grokbase.com/group/dbix-class@lists.scsys.co.uk

Reply via email to