[Dbix-class] how to add a method that performs a database lookup?

Toby Corkindale toby.corkindale at strategicdata.com.au
Tue Dec 16 00:31:33 GMT 2008


Adam Witney wrote:
>>>
>>> I am new to DBIx::Class, but have so far been impressed with how easy 
>>> it is to use, so thanks to those that have developed and continue to 
>>> develop it.
>>>
>>> I wanted to know, is there a way of adding a method to a class that 
>>> performs a separate database lookup. I have used the Cookbook example 
>>> for "Arbitrary SQL through a custom ResultSource", but this returns a 
>>> query that is plugged into a sub-select. Can i access the database 
>>> connection handle at all (eg $dbh) to build my own SQL query?
>>>
>>> thanks for any help
>>>
>>> adam
>>>
>>>
>>
>> You can, but before I tell you how I'm going to ask what kind of query 
>> you want. Give us SQL and we'll tell you if you can do it without 
>> going via the raw DBH.
> 
> ok i have several places i think I might need this!
> 
> I have two tables containing data that originated from files; one table 
> contains the filename, format etc and the other table contains the data 
> itself. The data table contains about 100 million rows now and the data 
> needs only be retrieved in chunks (about 5k-10k rows) corresponding to 
> the whole file (one row of first table), although the required columns 
> may very between queries. I was thinking that creating a class and hence 
> an object per row would make this slower, so i thought i could write a 
> method  that pulls back the whole data in one go for the main class/object.

Hmm, just out of interest, did you consider using the pg blob format for 
the file data instead? (Which lets you work on it using read/write/seek 
semantics)
Or has that fallen out of fashion these days?

If you're working with frames of a movie, or rows of a CSV file, or 
other such record-based data then I totally understand you would want to 
store them all in individual rows instead though.

If I understand your query, you want to do something like:
SELECT filedata.foo, filedata.bar
FROM filedata JOIN metadata ON filedata.metadata = metadata.id
WHERE metadata.filename = 'myFile.bin'
However you expect that to return 7k5 (+/- 2k5) rows and you'd like to 
retrieve it in chunks?


You could do it with pages, like this?
while(
   my @items = $schema->resultset('Filedata')->search(
     {
       'metadata.filename' => $filename,
     },
     {
       join => 'metadata',
       rows => 1000,
       page => $page++
     }
   )
) {
     do_stuff_with(@items)
}

But you're correct that it would be creating an object for every row.
However DBIC should be pulling down all 1000 of them from the DB in a 
single query.


> The second place i might need this is that i have some data in a second 
> database and so i would have to interact with this using dblink (I am 
> using PostgreSQL). This seems easier to just write the query in a method?

Doesn't Pg just represent the foreign DBI-Linked database as another 
schema? So I think you could just write the extra classes into dbic and 
it should query them, without realising their foreign?
.. I haven't tried it myself though.

-Toby

-- 
Strategic Data Pty Ltd
Ph: 03 9340 9000



More information about the DBIx-Class mailing list