[Dbix-class] Excluding columns from a query
Darren Duncan
darren at darrenduncan.net
Sat Feb 13 03:06:26 GMT 2010
Rob Kinyon wrote:
> On Fri, Feb 12, 2010 at 09:35, Nick Wellnhofer <wellnhofer at aevum.de> wrote:
>> On 12.02.2010 15:17, Rob Kinyon wrote:
>>> What is the *USE CASE* that is leading you to think that excluding
>>> columns from a ->search is a good idea?
>> It's simply an optimization. I have a table with a text column that can
>> contain tens of KB of data per row. I also have some queries that don't
>> need that column, so I'd like to avoid unnecessarily fetching all that
>> content from the DB.
>
> Ah. Now, had you said this at the beginning, you would have received
> an answer yesterday. http://www.google.com/?q=XY+Problem
>
> There is currently no clean way to do this. The best way I can think
> of would be something like:
> 1) Don't specify it as a column in your resultsource.
> 2) when you need it, add it in the columns=> attribute and use get_column('x')
>
> It's not very simple right now. Ideally, there would be a
> "fetch_lazily" column attribute. Patches welcome. :)
Logically, being able to specify directly what you don't want is a good idea
simply for means of completeness and balance.
In any situation where you can specify a condition, it is reasonable to be able
to specify the complementary or opposite condition with the same level of verbosity.
With Perl's "grep" or SQL's "where"/"having", specifying a complement is as
simple as prepending "not" to an otherwise identical condition. Both of these
operations are normally picking a subset of a given set, and it is reasonable to
request the complementary subset.
And so, if you can say "select <column-name-list> from foo" then one should also
be able to say "select all but <column-name-list> from foo". Arguing that this
shouldn't be the case is like arguing that "not" or "!" shouldn't be supported.
This is something simple that SQL should support natively, and if it doesn't
then that's a failing of SQL. (And individual DBMSs can still buck the trend by
supporting that even if the SQL standard doesn't, considering they all have
their own extensions anyway and this one is backwards compatible.) DBIx::Class
should support it natively regardless of whether SQL does just because it is
good design and keeps the interface more balanced, and there are reasonable use
cases for it. As for how that is implemented, well the process would be related
to how DBIx::Class supports "select * from foo"; to know what result columns you
will have, you consult metadata you have about the structure of foo, either that
you already hold or you ask the DBMS.
-- Darren Duncan
More information about the DBIx-Class
mailing list